Happens-Before 是一种内存可见性模型,在多线程环境下,原本因为指令重排序的存在,会导致数据的一个可见性问题。JMM 通过 Happens-Before 向开发人员提供了一个跨越线程的内存可见性的保障。如果一个操作的执行结果对于另外一个操作可见,那么我们认为这两个操作之间必然会存在一个 Happens-Before 的关系。
其次,Happens-Before 只是描述结果的可见性,并不表示指令执行的一个先后顺序,也就是说只要不对结果产生影响,仍然允许指令的一个重排序。
- 程序顺序规则:在一个线程内,如果操作A先行发生于操作B,那么操作A所产生的影响对于操作B是可见的。
- 管程锁定规则:是指对一个锁的解锁 先行于 后续对这个锁的加锁。
- volatile变量规则:一个线程修改了
volatile
变量,则对另外一个线程读取volatile
的变量是可见的。 - 线程start()规则:如果线程A执行了线程B的
start()
方法,则线程A在start()
之前的操作结果对于线程B都是可见的。 - 线程join()规则:如果线程A调用了线程B的
join()
方法,那么当线程B执行完成后,其中的所有操作对于线程A都是可见的 - 传递性:如果操作A先行发生于操作B,操作B先行发生于操作C,则操作A先行发生于操作C,也就说操作A所产生的所有影响对于操作C是可见的。