编译器和处理器不是胡乱的重排序的,他们会遵循一个关键的规则,就是数据依赖规则,如果说一个变量的结果依赖于之前的代码执行结果,那么就不能随意进行重排序,要遵循数据的依赖。
编译后的代码的执行顺序:java里有两种编译器,一个是静态编译器(javac),一个是动态编译器(JIT)。
在这个编译的过程中,编译器了提高代码的执行效率,很可能会调整代码的执行顺序。
即使我们给处理器一个代码的执行顺序,处理器也可能会重排代码,更换一种执行顺序。
有可能一个处理器在实际执行的过程中,在写缓冲器,高速缓存等等一些硬件也能导致指令执行顺序和我们想象的不一样。
如图所示,画红圈的都是可能发生指定重排的地方