单例模式
- 饿汉模式
- 初始化时间
类加载到JVM时 - 缺点
类加载慢 - 优点
- 获取对象速度快
- 避免多线程的同步问题
- 初始化时间
- 懒汉模式【线程不安全】
- 初始化时间
第一次调用方法时 - 缺点
- 第一次方法调用响应慢,因需要实例化对象。
- 多线程不安全
- 优点
节约资源
- 初始化时间
- 懒汉模式【线程安全】
- 初始化时间
第一次方法调用时 - 缺点
调用方法为“synchronized”加锁,性能低下,造成不必要开销
- 初始化时间
- 双重检查【DCL】
- 特点:volatile修饰类变量【单例变量】
- 缺点
- volatile或多或少性能,但为了正确性的牺牲是值得的。
- 第一次加载响应慢一些
- DCL失效【高并发下发生概率很小,但并不是说一定不发生】
参考[https://blog.youkuaiyun.com/m_xiaoer/article/details/73480137]
- 优点
- 效率高:两次判空,减少不必要同步【线程安全的懒汉模式,每次都要加锁判空】
- 资源利用率高
静态内部类 【推荐】
- 初始化时间
第一次调用静态方法时,内部类完成JVM的加载时,完成外部类单例的初始化 优点
保证单例,保证线程安全说明 1.到此为止的单例模式,在进行反序列化时,如果不对readResolve()方法做处理,则会生成新的对象,而不再是单例 2.反序列化时,能创建对象实例的方法是:readObject()
- 初始化时间
枚举单例
- 特点:
- 枚举天然的线程安全
- 枚举天然的反序列化时不会创建新的对象。
- 特点:
说明:
1.单例模式首推:静态内部类de方式
2.其次是:DCL方式
ps:7种单例模式的写方式
https://blog.youkuaiyun.com/itachi85/article/details/50510124