双重检查锁定来实现延迟初始化的方案:
class Instance { } /* * instance=new Singleton() memory = allocate(); // 1:分配对象的内存空间 ctorInstance(memory); // 2:初始化对象 instance = memory; // 3:设置instance指向刚分配的内存地址 */ public class SafeDoubleCheckedLocking { private volatile static Instance instance;//2,3之间不会重排序 public static Instance getInstance() { if (instance == null) { synchronized (SafeDoubleCheckedLocking.class) { if (instance == null) instance = new Instance(); // instance为volatile,现在没问题了 } } return instance; } }
基于类初始化的解决方案:(
JVM在类的初始化阶段(即在Class被加载后,且被线程使用之前),会执行类的初始化。在
执行类的初始化期间,JVM会去获取一个锁。这个锁可以同步多个线程对同一个类的初始化。
)
class Instance{ } public class InstanceFactory { private static class InstanceHolder { public static Instance instance = new Instance(); } public static Instance getInstance() { return InstanceHolder.instance; // 这里将导致InstanceHolder类被初始化 } }