本小节视频里老师给变量a,b加上了volatile关键字解决可见性问题。
然后说不可能出现a=1 b=3的情况。但是我在本机上测试了以下代码,发现是可以出现a=1 b=3的情况的。
我的分析是print()方法中System.out.println(“a=” + a + " b=" + b);这一句不是原子的,所以可能执行一半就发生了线程切换。比如:
线程1执行print()方法,此时a=1,b=2,
System.out.println(“a=” + a + " b=" + b)运行到一半,切换到线程2,线程2执行change()方法,此时a=3,b=3。
然后切换回线程1,继续执行未执行完的System.out.println(“a=” + a + " b=" + b),那么得到的结果就是a=1 b=3。
不知道我这么分析的对不对,希望老师能帮看看,谢谢!
package jmm;
public class FieldVisibility {
volatile int a = 1;
volatile int b = 2;
private void change() {
a = 3;
b = a;
}
private void print() {
// 这一句不是原子的,所以由于线程切换依然可能得到a=1 b=3
System.out.println("a=" + a + " b=" + b);
}
public static void main(String[] args) {
while (true) {
FieldVisibility test = new FieldVisibility();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
test.change();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
test.print();
}
}).start();
}
}
}