使用了Volatile后a=1;b=3为啥还会出现呢?
来源:12-10 可见性问题

qq_凛冬将至_9
2020-08-16
按照老师的print代码:
private void print() {
System.out.println("b=" + b + ";a=" + a);
}
执行后不存在b=3;a=1的情况,但是!
改成:
private void print() {
System.out.println("a=" + a + ";b=" + b);
}
执行后a=1;b=3依然会出现,不明白,请老师指导下
写回答
1回答
-
悟空
2020-08-17
小伙伴的提问很好,这是由于System.out.println
非原子性导致的。你代码里的打印是先打印a,然后打印b,而课程里的是先打印b然后打印a,由于println的非原子性性质,所以打印顺序是有区别的。课程里的代码,是不会出现b=3;a=1的情况的。
因为System.out.println(“a=” + a + " b=" + b)这一句不是原子的,所以执行期间是可以被切换的:先读取a的值为1并打印后,线程被切换走执行change(),此时b的值刚刚发生了变化(打印a的时候,b的值其实是2,但是现在变成了3),于是就会出现a=1,b=3。但是如果先打印b再打印a,那么打印了b之后,由于volatile的保证,可以确定a=3已经执行了并且最新值可以被所有线程看到,所以就不会出现b=3;a=1的情况,你可以试一下。
小伙伴还可以看下:https://coding.imooc.com/learn/questiondetail/141325.html
10
相似问题