编辑
2024-02-12
面试题库
0
请注意,本文编写于 345 天前,最后修改于 196 天前,其中某些信息可能已经过时。

重排序是指编译器和处理器为了提高程序执行效率,在不改变程序语义的前提下,对程序中的指令进行重新排列。

重排序可以分为三种类型

编译器重排序: 编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。

指令级并行重排序: 处理器可以使用指令级并行技术,将多条指令重叠执行,如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。

内存系统重排序: 由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是乱序执行。

JMM 通过以下机制防止重排序导致的问题

happens-before 规则: JMM 定义了 happens-before 规则,它定义了操作之间的执行顺序,指导编译器和处理器进行合法的重排序。例如,happens-before 规则要求,对 volatile 变量的写操作 happens-before 对该变量的读操作,从而确保对 volatile 变量的修改对其他线程可见。

内存屏障: JMM 在适当的位置插入内存屏障指令,禁止特定类型的重排序。例如,JMM 在 volatile 变量的读/写操作前后插入内存屏障,确保内存操作的顺序。

数据依赖性: JMM 确保编译器和处理器在重排序时遵守数据依赖性,不会改变存在数据依赖关系的两个操作的执行顺序。

本文作者:whitebear

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!