多线程无锁情况下对共享变量的可见性分析

本文分析了在Java多线程环境下,无锁情况下共享变量的可见性问题,重点探讨了JIT即时编译对线程工作内存副本的影响。通过代码实例展示了即使在JIT优化下,只有写操作的共享变量仍然能保持与主存同步,但如果涉及读取操作,则可能导致线程无法感知到其他线程的修改。
摘要由CSDN通过智能技术生成

先把代码截图,再看下文

// 建议可以代码截图,然后配合文字一起看
public class Test {
    static long a= 0; //共享变量
    public static void main(String[] args) throws Exception {
        Thread work = new Thread(() -> {
            while (a== 0) {}
        });
        work.start(); //工作线程开启
    }
}

        代码里的变量间的关系如下图,a 是共享变量,在主存,work线程的工作内存有一个主存共享变量a的副本 a1, main线程的工作内存有一个主存共享变量a的副本 a1,线程只能操作自己内存的副本a。

        当work的 while循坏的代码块被 JIT激进优化时,由于激进优化的代码块内有个共享变量a,所以,此时,a1=a 这条线断开,即副本a1 无法被主存更新了,但是,无论JIT优化开启与否,a=a1这条线是一定存在的,即工作内存一定可以将自己的副本a1的值赋值给主存的变量a,这个逻辑是恒成立的。

再来看看这段代码

public class Test {
    static long a 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值