发生在易失性领域之前的关系

时间:2013-01-26 09:26:17

标签: java multithreading concurrency

在Java Concurrency In Practice中,它说

  

在每次后续读取之前发生对易失性字段的写入   同一个领域

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

3 个答案:

答案 0 :(得分:4)

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

  • 如果写入是第一个,则before-before保证读取将看到新值。
  • 如果读取是第一个,那么在最近的早期写入发生之前保证读取将看到该写入的值。

答案 1 :(得分:3)

发生之前关系在Java规范中具有非常特定的含义。 Oracle概述了in their concurrency tutorial的含义。

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

更确切地说, if 首先执行写入,然后在执行后续读取操作之前,所有线程都可以看到该写入的效果。它只是提供内存一致性。

答案 2 :(得分:2)

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

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