单例模式双重检查锁(DCL)问题
单例模式DoubleCheck 锁问题
先贴代码
public class DoubleCheckSingleton {
private static DoubleCheckSingleton instance = null;
public static DoubleCheckSingleton getInstance(){
if(instance==null){
synchronized (DoubleCheckSingleton.class) {
if (instance == null) {
instance = new DoubleCheckSingleton();//这里由于out-of-order
}
}
}
return instance;
}
}
这里说的是语句instance = new DoubleCheckSingleton()不是一个原子操作
instance = new DoubleCheckSingleton();//这里由于out-of-order 无序操作
那么问题就来了:必然会做这么些事情
1,给DoubleCheckSingleton分配内存
2,初始化DoubleCheckSingleton实例
3,将instance对象指向分配的内存空间(instance为null了)
而在1,2,3中,执行顺序可能出现2,3或者3,2这种情况,如果是3,2 自然另一个线程拿到的可能是未初始化好的DoubleCheckSingleton
JDK1.5后可改为,private volatile static DoubleCheckSingleton instance = null 每次都从主内存读取instance
单例模式参考