Happens-Before 是一种内存可见性模型,在多线程环境下,原本因为指令重排序的存在,会导致数据的一个可见性问题。JMM 通过 Happens-Before 向开发人员提供了一个跨越线程的内存可见性的保障。如果一个操作的执行结果对于另外一个操作可见,那么我们认为这两个操作之间必然会存在一个 Happens-Before 的关系。
其次,Happens-Before 只是描述结果的可见性,并不表示指令执行的一个先后顺序,也就是说只要不对结果产生影响,仍然允许指令的一个重排序。

  1. 程序顺序规则:在一个线程内,如果操作A先行发生于操作B,那么操作A所产生的影响对于操作B是可见的。
  2. 管程锁定规则:是指对一个锁的解锁 先行于 后续对这个锁的加锁。
  3. volatile变量规则:一个线程修改了volatile变量,则对另外一个线程读取volatile的变量是可见的。
  4. 线程start()规则:如果线程A执行了线程B的start()方法,则线程A在start()之前的操作结果对于线程B都是可见的。
  5. 线程join()规则:如果线程A调用了线程B的join()方法,那么当线程B执行完成后,其中的所有操作对于线程A都是可见的
  6. 传递性:如果操作A先行发生于操作B,操作B先行发生于操作C,则操作A先行发生于操作C,也就说操作A所产生的所有影响对于操作C是可见的。

参考文档