/**
* DCL 懒汉模式
* new Singleton() JVM执行过程
* 1.给对象分配内存
* 2.实例化对象
* 3.对象引用指向内存 singleton == ???
* 编译器为了提升执行效率会指令重排,执行顺序并不会1.2.3,
* 要是一个线程执行1,3还没有执行2,第二个线程进来看到singleton != null,内存地址不是空的,但是对象还是空对象,拿对象去使用就会报空指针
*/
public class Singleton {
/**
* volatile 根据MESI协议,保证线程之间的可见性
*/
private static volatile Singleton singleton;
/**
* 私有化构造方法,防止外部实例化
*/
private Singleton(){
}
/**
* 获取对象实例
* @return
*/
public static Singleton getSingleton(){
// 双重锁检查
if (singleton == null){
synchronized (Singleton.class){
if (singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
DCL单例(懒汉)模式
最新推荐文章于 2022-05-13 17:23:32 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)