名词解释
JIT是just in time,即时编译技术。使用该技术,能提高JAVA程序的执行效率。可见性是一个线程对共享变量值的修改,能够及时被的被其他线程看到。
例子
public class Zuo {
private static boolean flag = true;
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
print();
}).start();
Thread.sleep(2500);
flag = false;
System.out.println("flag set to false");
}
private static void print() {
while (flag) {
}
}
}
上面这段代码在JVM默认参数下会一直执行下去,但是如果在VM options中加上-Xint
参数则不会。-Xint
这个参数的作用是让JVM在解释器的模式下执行。那么这里的区别就是是否进行了JIT优化。
使用hids
查看JIT后的汇编码后发现只在进入循环之前读取的flag变量,后面JMP指令无条件跳转了无论flag怎么变都不管了。JAVA内存模型中不能保证没有线程安全的字段将会看到更新。这个规定允许JIT进行这样的优化。
通过这个例子发现,在解释执行模式下不修改共享变量的值的情况下共享变量不加volatile关键字的变量也是具有多线程的可见性的。本地内存只是JAVA内存模型(JMM)的一个抽象概念,并不真实存在。