Happens-Before原则
JVM定义的Happens-Before原则是一组偏序关系:对于两个操作A和B,这两个操作可以在不同的线程中执行。如果A Happens-Before B,那么可以保证,当A操作执行完后,A操作的执行结果对B操作是可见的。
Happens-Before的规则包括:
- 程序顺序规则
- 锁定规则
- volatile变量规则
- 线程启动规则
- 线程结束规则
- 中断规则
- 终结器规则
- 传递性规则
程序顺序规则
在一个线程内部,按照程序代码的书写顺序,书写在前面的代码操作Happens-Before书写在后面的代码操作。这时因为Java语言规范要求JVM在单个线程内部要维护类似严格串行的语义,如果多个操作之间有先后依赖关系,则不允许对这些操作进行重排序。
锁定规则
对锁M解锁之前的所有操作Happens-Before对锁M加锁之后的所有操作。
volatile变量规则
对一个volatile变量的写操作及这个写操作之前的所有操作Happens-Before对这个变量的读操作及这个读操作之后的所有操作。
线程启动规则
Thread对象的start方法及书写在start方法前面的代码操作Happens-Before此线程的每一个动作。
线程终止规则
线程中的任何操作都Happens-Before其它线程检测到该线程已经结束。
中断规则
一个线程在另一个线程上调用interrupt,Happens-Before被中断线程检测到interrupt被调用。
终结器规则
一个对象的构造函数执行结束Happens-Before它的finalize()方法的开始。
传递性规则
如果操作A Happens-Before B,B Happens-Before C,那么可以得出操作A Happens-Before C。