关于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回答

悟空

2021-12-31

1:对于执行change方法的线程而言,是a = 3不会在b = 3之后,因为要满足“单线程内可见性原则”,也就是单线程内看到的,和代码书写顺序是一致的。如果b = 3前面如果有很多代码,这些代码都不会在b=3之后,但是这些代码内部是可以重排序的。

2:我认为https://coding.imooc.com/learn/questiondetail/y0K5g681gnmPe2QN.html这个同学说的是对的,如果加了volatile,那么不管有没有依赖,可见性是可以保证的。我之前的一些解答可能写错了。

0
3
风刚才唱歌
回复
悟空
好的 谢谢老师
2022-01-01
共3条回复

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

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

2512 学习 · 939 问题

查看课程