/**
* @Description 双检锁单例模式
* @Author
* @Date
**/
public class SigleTonDoubleCheck {
/**
* volatile 修饰避免重排序
* new 一个对象 分三步
* 注:instance来源: SigleTonDoubleCheck instance
* memory=allocate();申请内存
* instance(memory);2初始化对象
* intance=memory;3设置引用地址
*
* 2、3没有依赖关系
* 如果不使用volatile
*编译器可能会在未执行2的情况下执行3步骤 ,分配了内存,instance引用 指向了分配的内存地址 ,但是内存中却没存放该对象(实例化)。
* 这种情况下instance拥有内存地址,却没有任何内容,而instance!=null了因为地址不为空即使数据为空。
*
*/
private volatile static SigleTonDoubleCheck instance;
//构造方式私有,保持出口调用一致。
private SigleTonDoubleCheck(){}
public static SigleTonDoubleCheck getInstance(){
if (instance==null){
synchronized (SigleTonDoubleCheck.class){
if (instance==null){//这一步至关重要,如果不加 在多线程情况下依然会new一个不同的实例出来
instance=new SigleTonDoubleCheck();
}
}
}
return instance;
}
}
单例模式-双检锁说明
于 2023-11-03 10:49:25 首次发布