java单例模式

双检锁/双重校验锁(DCL,即 double-checked locking)

这种方式是懒汉式加载,采用双锁机制,安全且在多线程情况下能保持高性能。

  public class Singleton {
    // 关闭无参构造访问
    private Singleton() {
    }

    // 要加上volatile防止指令重排序
    private static volatile Singleton singleton;

    public static Singleton getInstance() {
        // 这个if判断是为了效率考虑,如果每次过来都加锁,就会效率很低
        if (singleton == null) {
            // 锁加在这里而不是外面,为了性能考虑
            synchronized (Singleton.class) {
                // 再次检查,防止多线程同时执行到锁跟前
                if (singleton == null) {
                  singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
  }

静态内部类

这种也是懒汉式,因为静态内部类不会立即被加载,在调用的时候才加载

  public class Singleton {
    // 关闭无参构造访问
    private Singleton() {
    }

    public static  Singleton getInstance(){
        return Inner.singleton;
    }

    private static class Inner{

        private static Singleton singleton =new Singleton();

    }

}

枚举类

天生的单例模式

  public enum EnumTest {
    A();
}
posted @ 2021-03-22 16:49  rm-rf*  阅读(31)  评论(0编辑  收藏  举报