3

在 Java Concurrency In Practice 中,它说

对 volatile 字段的写入发生在对同一字段的每次后续读取之前

这是否意味着如果两个线程尝试同时读取和写入 volatile 字段JVM 将确保写入操作先于读取操作,或者无论如何都会存在竞争条件?

4

3 回答 3

4

会有一个竞争条件。结果将取决于谁先到达:

  • 如果写入是第一个,happens-before 保证读取将看到新值。
  • 如果读取是第一个,那么最近发生的较早写入保证读取将看到该写入的值。
于 2013-01-26T09:27:46.550 回答
3

在Java 规范中, happens-before关系具有极其特殊的含义。Oracle在其并发教程中概述了它的含义。

重要的是要理解这种关系是随着在 CPU 上花费的时间而定义的。换句话说,它与事件发生的初始顺序无关:在您的应用程序中,写入或读取可能首先出现。

而是说,如果首先执行写入,那么在所有线程执行后续读取操作之前,该写入的效果将对所有线程可见。它只是提供内存一致性。

于 2013-01-26T09:34:57.730 回答
2

如果对 volatile 字段的写入发生在读取该字段之前,那么 volatile 将保证读取的值是最新值。

注意 volatile 不保证原子性,它保证可见性。

于 2013-01-26T09:41:58.627 回答