关于volatile指令防止重排序,指令重排序可能产生的问题用图详解

本文详细解释了Java中的指令重排序现象,特别是在懒汉式单例模式中的影响。如果不使用volatile关键字,可能导致instance在未完全初始化时被多个线程访问,从而引发错误。通过实例分析和图解,阐述了为什么在单例模式中需要volatile来防止指令重排序,确保线程安全。
摘要由CSDN通过智能技术生成

在java中,大家都会接触到指令重排序这个概念,在创建懒汉单例模式的时候都知道要加个volatile,可以解决重排序问题,但是刚开始我却发现很难理解指令重排序,不知道创建单例模式如果重排序会有什么问题,不知道该什么时候需要用volatile防止重排序。直到今天算是又进一步理解了,所以赶紧做了笔记,画了图分享给大家看看。

单例模式中如果不加volatile有可能出现指令重排序,比如:
private static ObjInstance instance;
//线程1
if(instance!=null){
    instance.method();
}
//线程2
if(instance==null){
    synchronized (ObjInstance.class){
        if(instance==null){
            instance = new ObjInstance();
        }
    }
}
//其中instance = new ObjInstance();分为3步骤:1)____给对象分配一块内存空间
(2)__new ObjInstance()__初始化对象
(3)instance= __new ObjInstance()__instance指向刚分配的地址
//但是(2)和(3)可能重排序,变成
(1)____给对象分配一块内存空间
(2)instance= ____instance指向刚分配的地址
(3)__new ObjInstance()__初始化对象
//这时候就可能执行到2的时候,if(instance!=null)结果为真就继续执行下去了,所以要加volatile

下面是用图的方式,可能比较好理解。
单例模式指令重排序

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值