在Java内存模型的有序性中存在一种“先行发生”(Happens-Before)的原则,其中线程启动规则具体描述如下:
Thread对象的start()方法先行发生于此线程的每一个动作。
在大多数文章中,都会直接得到一个结论,即线程启动规则还可以理解成:
线程A启动线程B之后,线程B能够看到线程A在启动线程B之前的操作。
其实这里存在一个推导,在八条Happens Before原则中,存在着这两条原则:
-
程序次序规则(Program Order Rule):在一个线程内,按照控制流顺序,书写在前面的操作先行发生于书写在后面的操作。注意,这里说的是控制流顺序而不是程序代码顺序,因为要考虑分支、循环等结构。
-
传递性(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可见。