happens-before 是什么?
先行发生原则,JMM 定义的两项操作间的偏序关系,是判断数据是否存在竞争的重要手段。
JMM 将 happens-before 要求禁止的重排序按是否会改变程序执行结果分为两类。对于会改变结果的重排序 JMM 要求编译器和处理器必须禁止,对于不会改变结果的重排序,JMM 不做要求。
JMM 存在一些天然的 happens-before 关系,无需任何同步器协助就已经存在。如果两个操作的关系不在此列,并且无法从这些规则推导出来,它们就没有顺序性保障,虚拟机可以对它们随意进行重排序。
- 程序次序规则:一个线程内写在前面的操作先行发生于后面的。
- 管程锁定规则: unlock 操作先行发生于后面对同一个锁的 lock 操作。
- volatile 规则:对 volatile 变量的写操作先行发生于后面的读操作。
- 线程启动规则:线程的
start
方法先行发生于线程的每个动作。 - 线程终止规则:线程中所有操作先行发生于对线程的终止检测。
- 对象终结规则:对象的初始化先行发生于
finalize
方法。 - 传递性:如果操作 A 先行发生于操作 B,操作 B 先行发生于操作 C,那么操作 A 先行发生于操作 C 。