单例模式双重检查锁(DCL)问题

时间:2023-03-08 22:01:35

单例模式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

单例模式参考

探索设计模式之六——单例模式

java并发可见性问题

自旋锁、排队自旋锁、MCS锁、CLH锁