在JMM中,如果一个操作的执行结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关系,这个的两个操作既可以在同一个线程,也可以在不同的两个线程中。
与程序员密切相关的happens-before规则如下:
程序顺序规则:一个线程中的每个操作,happens-before于该线程中任意的后续操作。
监视器锁规则:对一个锁的解锁操作,happens-before于随后对这个锁的加锁操作。
volatile域规则:对一个volatile域的写操作,happens-before于任意线程后续对这个volatile域的读。
传递性规则:如果 A happens-before B,且 B happens-before C,那么A happens-before C。
注意:两个操作之间具有happens-before关系,并不意味前一个操作必须要在后一个操作之前执行!仅仅要求前一个操作的执行结果,对于后一个操作是可见的,且前一个操作按顺序排在后一个操作之前。