先行发生原则
判断数据是否存在竞争,线程是否安全的有用手段——先行发生原则(Happens-Before
)。
如果两个操作之间的关系不在此列并且无法从下列规则推导出来,则它们就没有顺序性保障,
虚拟机可以对它们随意进行重排序。
程序次序规则(
Program Order Rule
):在一个线程内,按照控制流顺序,书写在前的操作先行发生与书写在后面的操作。
管程锁定规则(
Monitor Lock Rule
):一个unlock
操作先行发生于后面对同一个锁的lock
操作。(必须是同一个锁)volatile
变量规则(Volatile Variable Rule
):对一个volatile
变量的写操作先行发生于后面对这个变量的读操作。
线程启动规则(
Thread Start Rule
):Thread
对象的start()
方法先行发生于此线程的每一个动作。
线程终止规则(
Thread Termination Rule
):线程中的所有操作都先行发生于对此线程的终止检测,可以通过
Thread::join()
方法是否结束、Thread::isAlive()
的返回值等手段检测线程是否已经终止执行。
线程中断规则(
Thread Interruption Rule
):对线程interrupt()
方法的调用先行发生于被中断线程的代码检测到中断时间的发生,可以通过
Thread::interrupted()
方法检测到是否有中断发生。
对象终结规则(
Finalizer Rule
):一个对象的初始化完成(构造函数执行结束)先行发生于它的
finalize()
方法的开始。传递性(
Transitivity
):如果操作A先行发生于操作B,操作B先行发生于操作C,那么操作A先行发生于操作C。
衡量并发安全问题的时候不要受时间顺序的干扰,一切必须以先行发生原则为准。
这些规则为啥感觉很正常,能帮助判断并发吗?