关于volatile禁止指令重排
来源:12-15 解决问题

风刚才唱歌
2021-12-30
问题1
volatile禁止指令重排,那么禁止的时change这个方法那里的重排序?是a = 3不会在b = 3之后吗?如果是的话b = 3前面如果有很多代码都会按照书写顺序执行吗?
int a = 1;
volatile int b = 2;
private void change() {
a = 3;
b = 3;
}
private void print() {
System.out.println("b = " + b + ", a = " + a);
}
问题2
上面的print代码输出的时候是否能够保证a与b都等于3?如果说问题1假设成立的话那么是能够保证的。
但是 https://coding.imooc.com/learn/questiondetail/vQW1lYEEVVmYyE9A.html 这里说“就算b不涉及a,也可以只给b加volatile,因为只要修改了b,那么之前的代码(对a的修改)就可见。”
https://coding.imooc.com/learn/questiondetail/y0K5g681gnmPe2QN.html 这里又说不能保证,实在是搞晕了,求老师解答
写回答
1回答
-
1:对于执行change方法的线程而言,是a = 3不会在b = 3之后,因为要满足“单线程内可见性原则”,也就是单线程内看到的,和代码书写顺序是一致的。如果b = 3前面如果有很多代码,这些代码都不会在b=3之后,但是这些代码内部是可以重排序的。
2:我认为https://coding.imooc.com/learn/questiondetail/y0K5g681gnmPe2QN.html这个同学说的是对的,如果加了volatile,那么不管有没有依赖,可见性是可以保证的。我之前的一些解答可能写错了。
032022-01-01
相似问题