单例模式总结

单例模式

  • 饿汉模式  
    • 初始化时间  
      类加载到JVM时  
    • 缺点  
      类加载慢  
    • 优点  
      • 获取对象速度快 
      • 避免多线程的同步问题  
  • 懒汉模式【线程不安全】  
    • 初始化时间  
      第一次调用方法时
    • 缺点
      • 第一次方法调用响应慢,因需要实例化对象。
      • 多线程不安全
    • 优点
      节约资源
  • 懒汉模式【线程安全】
    • 初始化时间
      第一次方法调用时
    • 缺点
      调用方法为“synchronized”加锁,性能低下,造成不必要开销
  • 双重检查【DCL】
    • 特点:volatile修饰类变量【单例变量】
    • 缺点
      • volatile或多或少性能,但为了正确性的牺牲是值得的。
      • 第一次加载响应慢一些
      • DCL失效【高并发下发生概率很小,但并不是说一定不发生】
        参考[https://blog.csdn.net/m_xiaoer/article/details/73480137]
    • 优点
      • 效率高:两次判空,减少不必要同步【线程安全的懒汉模式,每次都要加锁判空】
      • 资源利用率高   
  • 静态内部类 【推荐】

    • 初始化时间
      第一次调用静态方法时,内部类完成JVM的加载时,完成外部类单例的初始化
    • 优点
      保证单例,保证线程安全

         说明
         1.到此为止的单例模式,在进行反序列化时,如果不对readResolve()方法做处理,则会生成新的对象,而不再是单例    
         2.反序列化时,能创建对象实例的方法是:readObject()
      
  • 枚举单例

    • 特点:
      • 枚举天然的线程安全
      • 枚举天然的反序列化时不会创建新的对象。

说明:
1.单例模式首推:静态内部类de方式
2.其次是:DCL方式
   

ps:7种单例模式的写方式  
https://blog.csdn.net/itachi85/article/details/50510124

你可能感兴趣的:(大话设计模式笔记)