Java 内存模型的 happen-before 原则

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 发生于中断线程检测到中断事件的发生

-----------本文结束感谢您的阅读-----------
0%