在 Java Concurrency In Practice 中,它说
对 volatile 字段的写入发生在对同一字段的每次后续读取之前
这是否意味着如果两个线程尝试同时读取和写入 volatile 字段,JVM 将确保写入操作先于读取操作,或者无论如何都会存在竞争条件?
在 Java Concurrency In Practice 中,它说
对 volatile 字段的写入发生在对同一字段的每次后续读取之前
这是否意味着如果两个线程尝试同时读取和写入 volatile 字段,JVM 将确保写入操作先于读取操作,或者无论如何都会存在竞争条件?
会有一个竞争条件。结果将取决于谁先到达:
在Java 规范中, happens-before关系具有极其特殊的含义。Oracle在其并发教程中概述了它的含义。
重要的是要理解这种关系是随着在 CPU 上花费的时间而定义的。换句话说,它与事件发生的初始顺序无关:在您的应用程序中,写入或读取可能首先出现。
而是说,如果首先执行写入,那么在所有线程执行后续读取操作之前,该写入的效果将对所有线程可见。它只是提供内存一致性。
如果对 volatile 字段的写入发生在读取该字段之前,那么 volatile 将保证读取的值是最新值。
注意 volatile 不保证原子性,它保证可见性。