请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于happens-before的问题

老师, 您好!

问题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的传递性规则

谢谢老师!!

正在回答 回答被采纳积分+3

1回答

悟空 2020-07-01 14:29:48

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

0 回复 有任何疑惑可以回复我~
  • 提问者 CoffeePlayer #1
    那我的问题一理解的对吗?
    回复 有任何疑惑可以回复我~ 2020-07-01 14:46:14
  • 提问者 CoffeePlayer #2
    老师,那我的问题一理解的对吗?
    回复 有任何疑惑可以回复我~ 2020-07-01 14:55:09
  • 悟空 回复 提问者 CoffeePlayer #3
    我理解的是,由于没有依赖关系,所以不能保证
    回复 有任何疑惑可以回复我~ 2020-07-01 20:15:23
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信