【多线程】结合例子理解happens-before含义以及其规则

Happens-Before 并不是说前面一个操作发生在后续操作的前面, 它真正要表达的是: 前面一个操作的结果对后续操作是可见的。

一、理解happens-before

1、如果⼀个操作happens-before另⼀个操作,那么第⼀个操作的执⾏结果将对第⼆个操作可⻅,⽽且第⼀个操作的执⾏顺序排在第⼆个操作之前。
2、两个操作之间存在happens-before关系,并不意味着Java平台的具体实现必须要按照happens-before关系指定的顺序来执⾏。如果重排序之后的执⾏结果,与按happens-before关系来执⾏的结果⼀致,那么JMM也允许这样的重排序。
如果操作A happens-before操作B,那么操作A在内存上所做的操作对操作B都是可⻅的,不管它们在不在⼀个线程
happens-before关系本质上和as-if-serial语义是⼀回事。as-if-serial语义保证单线程内重排序后的执⾏结果和程序代码本身应有的结果是⼀致的,happens-before关系保证正确同步的多线程程序的执⾏结果不被重排序改变

二、happens-before规则

下边前三个规则,都可以看这个例子来理解

 class VolatileExample{
   
    int a=0;
    volatile boolean flag=false;
    public void writer(){
   
        a=1;                                  // 操作1
        flag=true;                            // 操作2
    }
    public void reader()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值