1、基于volatile的解决方案
public class SafeDoubleCheckedLocking {
private volatile static Instance instance;
public static Instance getInstance(){
if(instance == null){
synchronized(SafeDoubleCheckedLocking.class){
if(instance == null){
instance = new Instance();//instance为volatile
}
}
}
return instance;
}
}
2基于类初始化的解决方案
JVM在类的初始化阶段(即在Class被加载后,且被线程使用之前),会执行类的初始化。在执行类的初始化期间,JVM会去获取一个锁。这个锁
可以同步多个线程对同一个类的初始化。
基于这个特性,可以实现另一种线程安全的延迟初始化方案。
public class InstanceFactory {
private static class InstanceHolder{
public static Instance instance = new Instance();
}
public static Instance getInstance(){
return InstanceHolder.instance;
}
}