【发布时间】:2013-01-26 09:26:17
【问题描述】:
在Java并发实践中,它说
对 volatile 字段的写入发生在每次后续读取之前 同一个字段
这是否意味着如果两个线程尝试同时读取和写入 volatile 字段,JVM 将确保写入操作先于读取操作,否则会有无论如何,比赛条件?
【问题讨论】:
标签: java multithreading concurrency
在Java并发实践中,它说
对 volatile 字段的写入发生在每次后续读取之前 同一个字段
这是否意味着如果两个线程尝试同时读取和写入 volatile 字段,JVM 将确保写入操作先于读取操作,否则会有无论如何,比赛条件?
【问题讨论】:
标签: java multithreading concurrency
会有一个竞争条件。结果将取决于谁先到达:
【讨论】:
happens-before 关系在 Java 规范中具有极其特殊的含义。 Oracle 提供了in their concurrency tutorial 含义的概述。
了解这种关系是随着 CPU 上花费的时间而定义的,这一点很重要。换句话说,它与事件发生的初始顺序无关:在您的应用程序中,写入或读取可能首先出现。
而是说如果首先执行写入,然后在执行后续读取操作之前,所有线程都可以看到该写入的效果。它只是提供内存一致性。
【讨论】:
如果对 volatile 字段的写入发生在对该字段的读取之前,那么 volatile 将保证读取为最新值。
注意 volatile 不保证原子性,它保证可见性。
【讨论】: