package com.wangyue.springcloud.singleton;
/**
* 懒汉式单例(线程不安全)
* 步骤:
* ① 构造器私有化
* ② 定义一个静态变量存储对象,
* ③ 定义一个获取单例的方法 双重检查,第二层检查加锁,同时需要volatile
*
*/
public class Singleton05 {
/**
* 为什么要使用volatile
*
* 因为创建对象有三步操作
* ① 分配内存空间
* ② 调用构造器进行实例化
* ③ 返回内存地址给引用
*
* 当CPU进行指令重排序的时候可能会存在
* ① 分配内存空间
* ③ 返回内存地址给引用 当执行到这一步的时候有可能其他线程拿到了引用地址并进行使用,此时对象还未初始化,因此会出现问题
* ② 调用构造器进行实例化
*/
//必须使用 volatile
private static volatile Singleton05 singleton05;
private void Singleton05(){
}
public static Singleton05 getInstance(){
if(singleton05==null){
//很多线程可以进入
synchronized (Singleton05.class){
if(singleton05==null){ // 可以保证线程安全,判断为空再加锁
singleton05 = new Singleton05();
}
}
}
return singleton05;
}
}
经典懒汉式双重检查 单例模式 加锁+volatile
最新推荐文章于 2023-08-15 18:47:02 发布