【发布时间】:2011-12-14 19:42:21
【问题描述】:
我想知道在 Java 中创建新线程是否会触发缓存刷新。假设我按以下顺序做这样的事情:
- 线程运行并设置变量 X。
- 线程创建一个新线程。
- 新线程访问 X。
我的问题是:新线程,无论是在它创建时还是在它开始执行时,是否保证看到旧线程在步骤 1 中对 X 所做的更新?我了解如果旧线程将来更改 X 的值,不保证新线程会看到这些更改。没关系。我只想知道新线程是否会在不需要显式同步的情况下启动时看到正确的值。
当我第一次决定研究这个主题时,我认为一个简单的谷歌搜索会立即找到答案,但由于某种原因,我找不到任何解决这个问题的结果。
【问题讨论】:
-
如果您可以只创建有问题的变量
volatile,为什么还要依赖这些模糊的保证(如果它们存在的话)? -
@delnan:这里没有什么晦涩难懂的。这种行为在 Java 语言规范中有明确规定。
-
现在一个更模糊的保证问题可能是:“A 写入 X;B 创建;C 读取 X”——这个行为是否已定义? :-)
-
@pst:不确定 B 是如何相关的。在这种情况下,C 可以保证看到默认值或 A 写入的值,但没有指定是哪一个。 (假设没有其他对 X 的写入,并且“A 写入 X”和“C 读取 X”操作未通过任何其他方式同步,例如通过使用 volatile)。
-
@pst:创建线程和等待(加入)线程时有同步。
标签: java multithreading concurrency thread-safety