public class VolatileDemo {
Integer o = 0;
boolean hasNew = false;
public void put(int a){
while (hasNew == true){
}
o = a;
hasNew = true;
}
public void printNew(){
while (hasNew == true){
System.out.println(o);
hasNew = false;
}
}
public static void main(String[] args) {
VolatileDemo volitileDemo = new VolatileDemo();
new Thread(() -> {
for (int i = 0; i < 1000; i++) {
volitileDemo.put(100);
}
}).start();
new Thread(() -> {
for (; ; ) {
volitileDemo.printNew();
}
}).start();
}
}
代码如图,我也清楚 volatile 具有禁止重排序以及内存可见性的问题。可是我还是不明白为什么 hasNew 设置为 volatile 之后,put 方法就执行了准确的1000次,而如果不是 volatile,则会执行不同的次数10 ~100 次。可以帮忙分析一下不加 volatile 的不同线程执行顺序以及加了 volatile 的不同线程执行顺序嘛?感谢各位!