单例模式的8种实现方式 优缺点分析

  • 何为单例模式

    • 保证在整个软件的系统中,对整个类只能存在一个对象实例,并且提供一个取得该对象的方法(一般是静态)
  • 有多种方式实现

    • 静态常量饿汉式

      • 构造器私有化
      • 本类内部创建对象实例(final static)
      • 提供一个公有的静态方法,返回对象实例
      • image-20211117212653901
      • 优点: 简单,在类加载的时候就完成实例化,避免了线程同步问题
      • 缺点: 没有实现懒加载,可能造成未使用,但已经加载了,则造成内存浪费
    • 静态代码块饿汉式

      • image-20211117213023240
      • 和上面那个没什么区别。。。还不如上面呢,代码行数增加了,国企狂喜
    • 线程不安全的懒汉式

      • image-20211117213238484
      • 很明显,确实是用到了才创建
      • 但是线程及其不安全,两个线程可能会重复实例化instance变量
      • 绝对不能使用这种哦
    • 线程安全的懒汉式

      • image-20211117213601670

      • 通过加锁来解决

      • 但是锁的粒度太粗了,性能捉急

    • 同步代码块的懒汉式

      • image-20211117213914321

      • 同样的,达不到线程安全的,两个线程同时到达锁,则会导致重复实例化

    • 双重检查

      • image-20211117214204656

      • 使用volatile可以来禁止指令重排序

      • 然后双重锁机制保证了线程安全,也保证了效率

    • 静态内部类

      • image-20211117214908417

      • 静态内部类的特点:

        • 当前类加载时,静态内部类不会被加载 (实现懒加载)
        • 当我们用到了静态内部类的方法时,才会被加载,而加载时,线程是安全的,只会加载一次(不用担心)
      • 所以使用静态内部类,可以实现懒加载,且保证线程安全,且保证效率

    • 枚举

      • image-20211117215614531
      • 还挺好,是effective java作者推荐的方式
      • 能够防止反序列化

总结

  • 饿汉式的前两种,和后面三种都是可以用的,结合具体场景来用
  • 尤其要考虑线程安全,然后要考虑效率,还有是否浪费内存空间

猜你喜欢

转载自blog.csdn.net/qq_34687559/article/details/121389027