- 编译器/处理器的重排序
- 流程
-
- 原则:
编译器和处理器在重排序时,会遵守数据依赖性。不会改变存在数据依赖性关系的操作的执行顺序。
-
- as-if-serial规则
内容:在单线程内,指令重排序后,其执行结果不能被改变。
即编译器和处理器不会对存在数据依赖关系的操作做重排序
-
- happens-before规则
目的:保证跨线程的内存可见性以及指令执行结果的不变性。
内容:如果一个操作A发生在另外一个操作B之前(可不同线程之间的操作),则A的执行结果对B是可见的,且A在B之前执行。如果一个操作A发生在另外一个操作B之前(可不同线程之间的操作),那么编译器处理器重排序之后不一定按照happens-before顺序执行,但执行结果肯定和happens-before执行结果一致。
-
- 重排序的规则
程序顺序规则:即保证单线程内操作的执行顺序不变
监视器锁规则:加锁在解锁之前
volatile变量规则:即共享变量的写对于之后的读都是生效的
传递性:A在B之前,B在C之前,那么A 在C之前
start()规则:线程A内执行B.start(),必定在B中的其他任意操作之前
join()规则:线程A中执行B.join(),则B中的操作肯定在B.join()返回之前执行
程序中断规则:线程interrupted()方法的调用,在被中断线程的代码检测到中断时间之前发生。
对象finalize规则:对象的初始化执行完成,必定在它finalize()之前完成
-
- 内存屏障(Memory Barrier )
内存屏障,又称内存栅栏,是一个CPU指令,可以禁止特定类型处理器的重排序,以保证特定操作的执行顺序,以及某些数据(或则是某条指令的执行结果)的内存可见性。