java编译时会对指令进行重排序。重排序会保证最终语意不变,在单线程下问题不大,但是多线程下可能就会有对同一个资源访问先后的问题。如果有竞争要时刻注意
在执行程序时为了提高性能,编译器和处理器经常会对指令进行重排序。重排序分成三种类型:
编译器优化的重排序。编译器在不改变单线程程序语义放入前提下,可以重新安排语句的执行顺序。
指令级并行的重排序。现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
内存系统的重排序。由于处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。
从Java源代码到最终实际执行的指令序列,会经过下面三种重排序: