关于happens-before的问题

来源:12-15 解决问题

CoffeePlayer

2020-07-01

老师, 您好!

问题1: volatile的近朱者赤的问题
看了一下老师对一位小伙伴提问的回答,我和老师的看法有一些出入, 不知道是否是因为我的理解有一些偏差。
图片描述

在这里我的理解是: 是可以保证的, 对于有依赖关系的变量,比如这里的 a = 3 ; b = a ;因为这两行代码是有依赖关系的, 所以不能发生重排序,a = 3的代码肯定是先执行的,根据happens-before的单线程规则,能推出hb(a ,b ) ; 因为变量b是voaltile关键字修饰的, 根据happens-before的volatile规则, 推出hb(b, readerThreadB); 根据happens-before的传递性规则,推出hb(a ,readerThreadB). 所以在执行如下语句时
图片描述

如果写线程先执行, 那么就不可能会出现 b = 3; a = 1 的情况。
即使两行代码没有依赖关系, 如下
图片描述
通过学习下一章的volatile关键字可以发现, volatile也是禁止重排序的,所以在voaltile变量之前的代码一定也会先执行, 也会出现上面的情况,所以也不会出现b=4;a=1的情况,所以我认为是可以保证的。

问题2:
这里是先打印了b,如果先打印a是否会出现 a = 1 ; b = 3这种情况吗?如下
图片描述我运行了,是可以出现这种情况的, 出现的原因是否是因为破坏了上面所说的happens-before的传递性规则

谢谢老师!!

写回答

1回答

悟空

2020-07-01

先打印a,结果不同的原因分析,你看下这个回答,讲了这个问题:http://coding.imooc.com/learn/questiondetail/141325.html

0
3
悟空
回复
CoffeePlayer
我理解的是,由于没有依赖关系,所以不能保证
2020-07-01
共3条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程