happen-before 口诀:如果两个操作之间具有 happen-before 关系,那么前一个操作结果就会对后一个操作可见。是 Java 内存模型中定义的两个操作之间的偏序关系。
常见的 happen-before 规则:
程序顺序规则:一个线程中的每个操作,happen-before 于该线程中的任意后续操作。
- 注解:如果只有一个线程的操作,那么前一个操作的结果肯定会对后续的操作可见
所规则:对一个锁的解锁 happen-before 于随后对这个锁的加锁
- 注解:这个最常见的就是 synchronized 方法和 synchronized 块
volatile 变量规则:对一个 volatile 域的写,happen-before 于任意后续对这个 volatile 域的读。该规则在 concurrentHashMap 中读操作不需要加锁有很好的体现
传递性:如果 A happen-before B,且 B happen-before C,那么 Ahappen-before C
线程启动规则:Thread 对象的 start() 方法 happen-before 此线程的每一个动作
线程终止规则:线程的所有操作都 happen-before 对此线程的终止检测,可通过 Thread.join() 方法结束、Thread.isAlive() 的返回值等手段检测线程是否已经停止运行
线程中断规则:对线程 interrupt() 方法的调用 happen-before 发生于中断线程检测到中断事件的发生