07:线程安全-可见性问题
由指令重排序引起的可见性问题: public class Test { // 如果运行时加上 -server 下面的代码就变成了死循环,没有加就正常运行。(运行器的编译优化只有在服务器模式下才执行) // 通过设置JVM参数,打印出JIT(即时编译)编译的内容(这里说的编译不是指class文件的编译,而是指未变级别的编译) private boolean flag = true; // -server -Djava.compiler=NONE 参数可以关闭jit优化。 // 在多线程中,由于指令重排序引起的线程可见性问题。 public static void main(String[] args) throws IOException, InterruptedException { Test demo1 = new Test(); new Thread(new Runnable() { @Override public void run() { int i = 0; // class文件在运行时jit编译成为汇编指令,汇编指令出现了重排序。 /* // 重排序后的逻辑。因为while语句里面需要一直判断flag。所以jvm优化为外层使用if判断一次。 if(demo1.flag){ while (true){ i++; } } hot code : 热点代码。