JIT和可见性

名词解释

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优化。

JIT和可见性_第1张图片

使用hids查看JIT后的汇编码后发现只在进入循环之前读取的flag变量,后面JMP指令无条件跳转了无论flag怎么变都不管了。JAVA内存模型中不能保证没有线程安全的字段将会看到更新。这个规定允许JIT进行这样的优化。
通过这个例子发现,在解释执行模式下不修改共享变量的值的情况下共享变量不加volatile关键字的变量也是具有多线程的可见性的。所谓的本地内存只是JAVA内存模型(JMM)的一个抽象概念,并不真实存在。

你可能感兴趣的:(java)