关于线程启动规则的推导

47 阅读1分钟

在Java内存模型的有序性中存在一种“先行发生”(Happens-Before)的原则,其中线程启动规则具体描述如下:

Thread对象的start()方法先行发生于此线程的每一个动作

在大多数文章中,都会直接得到一个结论,即线程启动规则还可以理解成:

线程A启动线程B之后,线程B能够看到线程A在启动线程B之前的操作

其实这里存在一个推导,在八条Happens Before原则中,存在着这两条原则:

  1. 程序次序规则(Program Order Rule):在一个线程内,按照控制流顺序,书写在前面的操作先行发生于书写在后面的操作。注意,这里说的是控制流顺序而不是程序代码顺序,因为要考虑分支、循环等结构。

  2. 传递性(Transitivity):如果操作A先行发生于操作B,操作B先行发生于操作C,那就可以得出操作A先行发生于操作C的结论。

举个例子,我们在某个线程中执行Thread的start方法启动另一个线程时,如果之前修改了某些共享变量的值,这些操作我们统称之为A,Thread的start方法称之为B,那么根据程序次序原则,A happens before B,将另一个线程中的操作称之为,那么根据线程启动原则,B happens bofore C,再根据传递性原则,有A happens before C,因此在执行操作C时,A操作对共享变量所做的所有修改对C可见。