单例模式之双重校验锁为什么校验两次
第一次校验是为了检查变量是否被初始化(对象被创建出来后,后期可以不用去获得锁,提高了效率)。
第二次校验是因为在第一个if和synchronized之间仍有可能被另外线程插入,这会导致第一个if判断依然为null时,即如果不加第二次校验可能会创建出多个对象。
下面展示双重校验单例模式的代码。
// A code block
public class Lock2Singleton {
private volatile static Lock2Singleton INSTANCE; // 加 volatile
private Lock2Singleton() {}
public static Lock2Singleton getSingleton() {
if (INSTANCE == null) { // 双重校验:第一次校验
synchronized(Lock2Singleton.class) { // 加 synchronized
if (INSTANCE == null) { // 双重校验:第二次校验
INSTANCE = new Lock2Singleton();
}
}
}
return INSTANCE;
}
}