单例模式的常见写法:饿汉式、懒汉式、注册式、ThreadLocal
饿汉式:
- 类加载的时候进行实例创建
- 优点:执行性能高,效率好,没有加锁
- 缺点:系统创建大量的类时,全都加载到内存中,操作内存浪费
懒汉式:
- 只有在对象在使用的时候才会被初始化
- 双重检查锁
- volatile修饰对象,禁止指令重排序,返回初始化完整的对象
- 两次判断null,在内部层进行synchronized修饰,保证只有一个实例被创建
- 静态内部类实现
- 利用Java的静态内部类在调用时才会被加载的特性
- 内部类中创建外层对象,外层访问静态内部类成员
- 在私有构造函数中判断是否有值,有值则抛出异常,防止反射破坏单例
注册式:
- 枚举单例
- 最优雅的写法
- 在底层防止反射破坏
- 天然的线程安全
- 内部使用Map<String,T>存储
- 不适合大量加载,因为在类加载的时候就会把实例注册到容器中
- 容器式单例
- 对枚举进行改良,在使用时在去创建,放入到容器中
- 判断当前类型名称是否存在,存在直接取,不存在,通过反射instance,放到容器中
ThreadLocal:
- 类中声明一个ThreadLocal变量,存放类的实例
- 盼达实例是否存在,不存在,new一个放入,存在,直接取
- 在线程内唯一