jvm在不影响正确性的前提下,可以调整语句的执行顺序。
jvm调整指令执行的顺序叫做指令重排。
多线程下这种指令重排会影响正确性,而单线程没有问题。
JIT即时编译器做的一些优化。
volatile修饰就可以解决指令重排序。
public class VolatileDemoOrder {
int num = 0;
volatile boolean ready = false;
public void actor1(int r) {
if(ready) {
r = num + num;
} else {
r = 1;
}
}
public void actor2() {
//不发生指令重排序,那么actor1方法中的r可能为4.
//这里如果发生了指令重排序,执行顺序会发生调换,那么actor1方法中的r可能为0,
//给ready变量添加volatile修饰,表示ready = true这行代码之前的代码不会发生指令重排序.
num = 2;
ready = true;
}
}