创建新线程是否会产生刷新缓存的副作用?

时间:2011-12-14 19:42:22

标签: java multithreading concurrency thread-safety

我想知道在Java中创建新线程是否会触发缓存刷新。假设我按照以下顺序执行此类操作:

  1. 线程运行并设置变量X。
  2. 线程创建一个新线程。
  3. 新线程访问X。
  4. 我的问题是:新线程是在创建时还是在开始执行时,保证看到第1步中旧线程对X进行的更新?我知道如果旧线程将来更改X的值,则无法保证新线程将看到这些更改。没关系。我只是想知道新线程在启动时是否会看到正确的值,而不需要显式同步。

    当我第一次决定调查此主题时,我认为一个简单的谷歌搜索会立即显示答案,但由于某种原因,我找不到任何解决此问题的结果。

1 个答案:

答案 0 :(得分:9)

是的,是的。

在java中,有'before-before'关系指定两个动作之间可见的记忆效果。如果“A发生在B之前”,则动作B保证看到动作A完成的所有更改。

启动线程会在“thread.start()”调用与在新线程上执行的所有代码之间创建“之前发生”关系。因此,新线程可以保证在第一个线程上看到更改变量X的记忆效应。

有关发生在之前的关系的快速概述,请参阅java.util.concurrent包概述的Memory Visibility部分。在您的情况下,有趣的位是:

  • 线程中的每个操作都发生在该程序订单后面的该线程中的每个操作之前。
  • 在启动线程中的任何操作之前发生对线程启动的调用。

如果您感到好奇,可以使用更多链接: