先行发生原则
判断数据是否存在竞争,线程是否安全的有用手段——先行发生原则(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。
衡量并发安全问题的时候不要受时间顺序的干扰,一切必须以先行发生原则为准。
这些规则为啥感觉很正常,能帮助判断并发吗?