Bootstrap

单例模式之双重校验锁为什么校验两次

单例模式之双重校验锁为什么校验两次

第一次校验是为了检查变量是否被初始化(对象被创建出来后,后期可以不用去获得锁,提高了效率)。
第二次校验是因为在第一个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;
    }
}

;