现代CPU并不总是按照更新的顺序将数据写入内存,例如,如果您运行伪代码(为了简单起见,假设变量始终存储在此处的内存中);
a = 1
b = a + 1
...CPU很可能在写入内存之前写入内存。只要您在单个线程中运行内容,这并不是一个真正的问题,因为运行上述代码的线程在进行赋值后将永远不会看到任何一个变量的旧值。b
a
多线程是另一回事,你会认为下面的代码会让另一个线程拾取你的繁重计算的价值;
a = heavy_computation()
b = DONE
...另一个线程正在做...
repeat while b != DONE
nothing
result = a
但问题是,在将结果存储到内存之前,可能会在内存中设置 done 标志,因此在将计算结果写入内存之前,另一个线程可能会获取内存地址 a 的值。
同样的问题 - 如果Thread.start
和Thread.join
没有“发生之前”的保证 - 给你一些代码问题,比如;
a = 1
Thread.start newthread
...
newthread:
do_computation(a)
...因为在线程启动时可能没有值存储到内存中。a
由于您几乎总是希望新线程能够使用在启动之前初始化的数据,因此具有“发生之前”的保证,即在调用 Thread.start
之前已更新的数据保证对新线程可用。同样的事情也适用于新线程写入的数据保证在终止后对连接它的线程可见的情况。Thread.start
Thread.join
它只是使线程更容易。