基本原则
-
程序次序规则(Program Order Rule) :
- 在一个线程中,按照程序代码顺序,前面的操作
happens-before后面的操作。 - 例如,在同一个线程中,语句
A; B;保证A happens-before B。
- 在一个线程中,按照程序代码顺序,前面的操作
-
监视器锁定规则(Monitor Lock Rule) :
- 一个锁的解锁操作
happens-before该锁的后续加锁操作。 - 例如,如果线程 A 解锁了一个锁,然后线程 B 试图加锁,那么线程 A 的解锁操作
happens-before线程 B 的加锁操作。
- 一个锁的解锁操作
-
volatile 变量规则(Volatile Variable Rule) :
- 对一个
volatile变量的写操作happens-before后续对这个volatile变量的读操作。 - 例如,如果线程 A 写入一个
volatile变量,然后线程 B 读取同一个volatile变量,那么线程 A 的写操作happens-before线程 B 的读操作。
- 对一个
-
传递性(Transitivity) :
- 如果操作 A
happens-before操作 B,且操作 Bhappens-before操作 C,那么操作 Ahappens-before操作 C。
- 如果操作 A
线程启动和终止
-
线程启动规则(Thread Start Rule) :
- 线程的启动操作
happens-before启动线程中的任何操作。 - 例如,如果线程 A 启动线程 B,那么线程 A 中启动线程 B 的操作
happens-before线程 B 中的任何操作。
- 线程的启动操作
-
线程终止规则(Thread Termination Rule) :
- 线程中的所有操作
happens-before其他线程检测到该线程已经终止。 - 例如,如果线程 A 终止并且线程 B 检测到线程 A 已经终止,那么线程 A 的所有操作
happens-before线程 B 检测到线程 A 已经终止的操作。
- 线程中的所有操作
-
线程中断规则(Thread Interruption Rule) :
- 对线程的
interrupt()调用happens-before被中断线程检测到中断事件的发生。 - 例如,如果线程 A 调用线程 B 的
interrupt()方法,那么线程 A 的interrupt()调用happens-before线程 B 检测到中断的发生(例如,通过InterruptedException或isInterrupted()方法)。
- 对线程的
对象终结规则(Finalizer Rule)
-
对象终结规则(Finalizer Rule) :
- 一个对象的构造函数执行结束
happens-before该对象的终结器(finalize方法)的开始。 - 例如,如果对象 A 的构造函数执行结束,那么该构造函数的结束
happens-before对象 A 的finalize方法的开始。
- 一个对象的构造函数执行结束