package com.zr.single;
/**
* 支持并发的两次判空懒汉单例
*/
public class TwiceJudgeNullLazySingleton {
private TwiceJudgeNullLazySingleton() {
}
private static TwiceJudgeNullLazySingleton instance;
public static TwiceJudgeNullLazySingleton getInstance() {
// 第一次判空的意义在于: 其它线程访问该对象实例时, 已经有了对象实例, 直接返回。
if(instance == null){
// 这里加类对象同步代码块的意义在于: 防止多个线程同时创建实例。
synchronized(TwiceJudgeNullLazySingleton.class) {
// 第二次判空的意义在于: 多个线程访问创建该对象实例时, 由于创建对象实例的过程过慢, 多个线程都已经运行过了第一个判空。
if(instance == null) {
instance = new TwiceJudgeNullLazySingleton();
}
}
}
return instance;
}
}