Java发生指令重排的几个地方

一.指定重排的原则

编译器和处理器不是胡乱的重排序的,他们会遵循一个关键的规则,就是数据依赖规则,如果说一个变量的结果依赖于之前的代码执行结果,那么就不能随意进行重排序,要遵循数据的依赖。

二.指定重排的位置

2.1 编译时

编译后的代码的执行顺序:java里有两种编译器,一个是静态编译器(javac),一个是动态编译器(JIT)。

  • javac负责把.java文件中的源代码编译为.cass文件中的字节码,这个一般是程序写好之后进行编译的。
  • JIT负责把.class文件中的字节码编译为JVM所在操作系统支持的机器码,一般在程序运行过程中进行编译。

在这个编译的过程中,编译器了提高代码的执行效率,很可能会调整代码的执行顺序。

2.2 处理器执行时候

即使我们给处理器一个代码的执行顺序,处理器也可能会重排代码,更换一种执行顺序。

2.3 内存重排序

有可能一个处理器在实际执行的过程中,在写缓冲器,高速缓存等等一些硬件也能导致指令执行顺序和我们想象的不一样。


如图所示,画红圈的都是可能发生指定重排的地方

你可能感兴趣的:(Java发生指令重排的几个地方)