单例实现汇总

1. 启动时加载
1.1 - static new
1.2 - static class new
2. 延迟加载
2.1 - synchronized
2.2 - 双重锁检查 + volatile
2.3 - Java9中引入AtomicReference
3. 枚举实现

public class SingletonDemo {      //1. 启动时加载     //      1.1 - static new     //      1.2 - static class new     //2. 延迟加载     //      2.1 - synchronized     //      2.2 - 双重锁检查 + volatile     //      2.3 - Java9中引入AtomicReference     //3. 枚举实现      public static void main(String[] args) {         System.out.println(SingletonV11.getInstance() == SingletonV11.getInstance());         System.out.println(SingletonV12.getInstance() == SingletonV12.getInstance());         System.out.println(SingletonSynchronized.getInstance() == SingletonSynchronized.getInstance());         System.out.println(SingletonDoubleCheckVolatile.getInstance() == SingletonDoubleCheckVolatile.getInstance());         System.out.println(SingletonAtomicReference.getInstance() == SingletonAtomicReference.getInstance());         System.out.println(SingletonEnum.getInstance() == SingletonEnum.getInstance());     }      //1.1 - 启动时初始化单例     static class SingletonV11 {         private static final SingletonV11 singletonV11 = new SingletonV11();          private SingletonV11() {             System.out.println(SingletonV11());         }          public static SingletonV11 getInstance() {             return singletonV11;         }     }      //1.2 - 启动时利用内部静态类初始化单例     static class SingletonV12 {          private static class SingletonHolder {             private static final SingletonV12 singletonV12 = new SingletonV12();         }          private SingletonV12() {             System.out.println(SingletonV12());         }          public static SingletonV12 getInstance() {             return SingletonHolder.singletonV12;         }     }      //2.1 - synchronized版本,线程排队执行     static class SingletonSynchronized {          private static SingletonSynchronized singletonSynchronized = null;          private SingletonSynchronized() {             System.out.println(SingletonSynchronized());         }          public synchronized static SingletonSynchronized getInstance() {             if (singletonSynchronized == null) {                 singletonSynchronized = new SingletonSynchronized();             }             return singletonSynchronized;         }     }      //2.2 - 双重检查 + volatile     static class SingletonDoubleCheckVolatile {          private volatile static SingletonDoubleCheckVolatile singletonDoubleCheckVolatile = null;          private SingletonDoubleCheckVolatile() {             System.out.println(耗时长);             System.out.println(SingletonDoubleCheckVolatile());         }          public static SingletonDoubleCheckVolatile getInstance() {             if (singletonDoubleCheckVolatile == null) {                 synchronized(SingletonDoubleCheckVolatile.class) {                     if (singletonDoubleCheckVolatile == null) {                         //调用构造函数可能会存在指令重排,使用volatile                         singletonDoubleCheckVolatile = new SingletonDoubleCheckVolatile();                     }                 }             }             return singletonDoubleCheckVolatile;         }     }      //2.3 - Java9中使用AtomicReference,避免volatile使得指令的上下部分会指令重排     static class SingletonAtomicReference {          private static AtomicReference<SingletonAtomicReference> singletonAtomicReference = new AtomicReference<>();          private SingletonAtomicReference() {             System.out.println(耗时长);             System.out.println(SingletonAtomicReference());         }          public static SingletonAtomicReference getInstance() {             var localRef = singletonAtomicReference.getAcquire();             if (localRef == null) {                 synchronized (SingletonAtomicReference.class) {                     localRef = singletonAtomicReference.getAcquire();                     if (localRef == null) {                         singletonAtomicReference.setRelease(new SingletonAtomicReference());                         localRef = singletonAtomicReference.getAcquire();                     }                 }             }             return localRef;         }     }      //3. 枚举实现,避免使用反射机制构造其他实例     static enum SingletonEnum {         INSTANCE;          public static SingletonEnum getInstance() {             return INSTANCE;         }     } }