先行发生原则

判断数据是否存在竞争,线程是否安全的有用手段——先行发生原则(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。

衡量并发安全问题的时候不要受时间顺序的干扰,一切必须以先行发生原则为准。

这些规则为啥感觉很正常,能帮助判断并发吗?