重排序是指编译器和处理器为了提高程序执行效率,在不改变程序语义的前提下,对程序中的指令进行重新排列。
重排序可以分为三种类型:
编译器重排序: 编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
指令级并行重排序: 处理器可以使用指令级并行技术,将多条指令重叠执行,如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
内存系统重排序: 由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是乱序执行。
JMM 通过以下机制防止重排序导致的问题:
happens-before 规则: JMM 定义了 happens-before 规则,它定义了操作之间的执行顺序,指导编译器和处理器进行合法的重排序。例如,happens-before 规则要求,对 volatile 变量的写操作 happens-before 对该变量的读操作,从而确保对 volatile 变量的修改对其他线程可见。
内存屏障: JMM 在适当的位置插入内存屏障指令,禁止特定类型的重排序。例如,JMM 在 volatile 变量的读/写操作前后插入内存屏障,确保内存操作的顺序。
数据依赖性: JMM 确保编译器和处理器在重排序时遵守数据依赖性,不会改变存在数据依赖关系的两个操作的执行顺序。
本文作者:whitebear
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!