如下代码:
public class VolatileTest {
volatile int value1;
int value2;
public static void main(String[] args) {
final VolatileTest main=new VolatileTest();
new Thread(()->{
int value=0;
while(true){
value++;
main.value2=value;//1
main.value1=value;//2
}
}).start();
new Thread(()->{
while(true){
int v1=main.value1;//3
int v2=main.value2;//4
if(v2<v1){
System.out.println(String.format("error v1=%d v2=%d",v1,v2));
}
}
}).start();
}
}
会打印出error吗?(这里有个Bug,先不考虑,就是整数会溢出的情况)
答案是不会,因为value1是volatile的,根据可见性,那么2 happens before 3,所以递推,4 happens before 1。所以v2不可能小于v1。
如果去掉volatile,就有可能发生。