一.指定重排的原则
编译器和处理器不是胡乱的重排序的,他们会遵循一个关键的规则,就是数据依赖规则,如果说一个变量的结果依赖于之前的代码执行结果,那么就不能随意进行重排序,要遵循数据的依赖。
二.指定重排的位置
2.1 编译时
编译后的代码的执行顺序:java里有两种编译器,一个是静态编译器(javac),一个是动态编译器(JIT)。
- javac负责把.java文件中的源代码编译为.cass文件中的字节码,这个一般是程序写好之后进行编译的。
- JIT负责把.class文件中的字节码编译为JVM所在操作系统支持的机器码,一般在程序运行过程中进行编译。
在这个编译的过程中,编译器了提高代码的执行效率,很可能会调整代码的执行顺序。
2.2 处理器执行时候
即使我们给处理器一个代码的执行顺序,处理器也可能会重排代码,更换一种执行顺序。
2.3 内存重排序
有可能一个处理器在实际执行的过程中,在写缓冲器,高速缓存等等一些硬件也能导致指令执行顺序和我们想象的不一样。
如图所示,画红圈的都是可能发生指定重排的地方
网友评论