在Java Concurrency In Practice中,它说
在每次后续读取之前发生对易失性字段的写入 同一个领域
这是否意味着如果两个线程尝试同时读取和写入易失性字段, JVM将确保写入操作先于读取操作,或者是否存在无论如何都是竞争条件?
答案 0 :(得分:4)
会有竞争条件。结果将取决于谁先到达那里:
答案 1 :(得分:3)
发生之前关系在Java规范中具有非常特定的含义。 Oracle概述了in their concurrency tutorial的含义。
了解关系是在CPU上花费的时间定义的,这一点很重要。换句话说,它与事件发生的初始顺序无关:写入或读取可能首先出现在您的应用程序中。
更确切地说, if 首先执行写入,然后在执行后续读取操作之前,所有线程都可以看到该写入的效果。它只是提供内存一致性。
答案 2 :(得分:2)
如果在读取该字段之前发生了对volatile字段的写入,那么volatile将保证读取将是最新值。
注意volatile不保证原子性,它保证了可见性。