老师, 您好!
问题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的传递性规则
谢谢老师!!