package cn.note.single;
/**
* 懒汉模式(二)特别
* @author moke
*/
public class LazyModeB {
private volatile static LazyModeB instance = null;
/**
* 关闭new方式实例化(然后还是能通过反射创建的......)
*/
private LazyModeB(){}
public static final LazyModeB getInstance(){
if(instance == null){
synchronized (LazyModeB.class){
if(instance == null){
/**
* 这一步操作在jvm内存模型里存在问题
* new对象分为三步:
* 1、分配内存空间
* 2、构造函数初始化
* 3、地址赋值给变量
* 然后jvm内存模型里的执行顺序会优化(对执行顺序重排),如果顺序变为1、3、2,另一个线程将有机可乘,在3与2之间介入.将会引起程序崩溃
* volatile能解决是因为它拥有一定程序的有序性,可以让修饰的变量前后顺序不变(指前面的不会到后面,后面的不会到前面,但不包括前面位置的调整、后面位置的调整)
* 额外知识:volatile有可见性.每个线程都有其工作内存(线程间相互独立的内存),线程操作后不一定会立刻把数据变动写入到主存(各线程共有的内存)中,这种现象叫“不可见”,
* 这样其他线程有可能无法获取的正确的信息.而volatile修饰的将会立即写入到主存,避免这种问题
*/
instance = new LazyModeB();
}
}
}
return instance;
}
}
单例模式-懒汉模式(二)
最新推荐文章于 2023-03-10 15:41:36 发布