【发布时间】:2017-12-19 02:58:09
【问题描述】:
我正在阅读 JCIP,无法理解 3.3.1 中的以下语句,
只要您可以确保 volatile 变量仅从 SINGLE 线程写入,对共享 volatile 变量执行读-修改-写操作是安全的。在这种情况下,您将修改限制在单个线程以防止出现竞争条件,并且 volatile 变量的可见性保证可确保其他线程看到最新的值。
即使 volatile 变量只从单个线程写入,它怎么能不引发竞态条件呢?如果线程 A 在 counter 为 1 时执行 counter++,则线程 B 可以在 counter+1 写回内存之前进入,并获得 counter 的陈旧值 1。如何确保“防止竞争条件”和“其他线程看到最新的值”??
附言我知道here 有同样的问题,但我没有找到任何令人满意的答案。
【问题讨论】:
-
“线程 B 可以在 counter+1 写回内存之前进入”。是的——这意味着线程 B 在读取数据时获得了最新的值。这就是它所确保的。在您看来,这如何造成竞争条件?
-
规范尽可能清晰。在您的示例中,包括线程 B 在内的所有线程都将在
counter+1写入内存之前看到 1 。一旦写入,他们都会看到 2。绝不会有一些线程看到 1 而其他线程看到 2。 -
@tsolakp 你是对的。我对“陈旧价值”的概念感到困惑。这里线程 B 读取的是“更新”值,而不是“陈旧”值,因为那是 A 最后写入内存的值。线程 A 和 B 在这里完美同步。
-
@Erwin 阅读您所说的内容后,这很有意义。谢谢。
标签: java multithreading