双重校验锁 为啥要用volatile修饰

双重校验锁中volatile的使用防止了指令重排序可能导致的多线程问题。当不使用volatile时,对象初始化与赋值可能被重排序,导致线程安全问题。volatile确保初始化顺序,保证线程安全的延迟初始化。
摘要由CSDN通过智能技术生成
public class Single {
    private static volatile Single single;
    public static Single getSingle(){
        if (single==null){
            synchronized (Single.class){
                if (single==null){
                    single=new Single();
                }
            }
        }
        return null;
    }
}

因为如果不用volatile修饰的话,在 single=new Single();会发生指令重排序,

Single的代码可以分解为三个部分

  1. 分配对象的内存空间
  2. 初始化对象
  3. 设置single指向内存空间

在JIT里,可能会将2与3进行重排序,在单线程里这里并不会发生什么问题,但是在多线程情况下,会出现下面的问题

时间

线程A

线程B

t1

A1:分配对象的内存空间

 

t2

A3:设置single指向内存空间

 

t3

 

B1:判断single是否为空

t4

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值