happens-before用来阐述操作之间的可见性。
来源:《Java并发编程的艺术》
在jvm中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作必须存在happens-before关系。这里提到的两个操作既可以是在一个线程之内,也可以是在不同线程之间。
- 程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。
- 监视器锁操作:对一个锁的解锁,happens-before于随后对这个锁的加锁。
- volatile变量规则:对一个域的写,happens-before于任意后续对这个volatile域的读。
- 传递性:如果A happens-before B,且B happens-before C,则A happens-before C。
注意:两个操作之间具有happens-before关系,并不意味着前一个操作必须要在后一个操作之前执行!happens-before仅仅要求前一个操作(执行结果)对后一个操作可见。且前一个操作按顺序排在第二个操作之前。
happens-before和JVM的关系: