转自:http://blog.csdn.net/turkeyzhou/article/details/6179951
清单 4. 双重检查锁定示例(DCL)
public static Singleton getInstance()
{
if (instance == null)
{
synchronized(Singleton.class) { //1
if (instance == null) //2
instance = new Singleton(); //3
}
}
return instance;
}
以上可能得到一个没有初始化完成的对象,
jdk1.5后,可通过volatile修饰符解决
public class Singleton {
private volatile static Singleton anInstance;
private Singleton() {}
public static Singleton getInstance() { //若此处就用synchronized则每次getInstance的代价都非常高
if( anInstance == NULL ){ //可能多个线程第一次均同时满足此条件
synchronized ( Singleton.class ) { //此时才进行代价较高的synchronized
if( anInstance == NULL ) {
anInstance = new Singleton();
}
}
}
return anInstance;
}
}