单例模式双重检查锁(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

单例模式参考

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

java并发可见性问题

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

posted @ 2015-01-19 00:58  东岸往事  阅读(739)  评论(0编辑  收藏  举报