【问题标题】:Happens-Before relation in volatile fieldsHappens-Before 易失性领域的关系
【发布时间】:2013-01-26 09:26:17
【问题描述】:

在Java并发实践中,它说

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

这是否意味着如果两个线程尝试同时读取和写入 volatile 字段JVM 将确保写入操作先于读取操作,否则会有无论如何,比赛条件?

【问题讨论】:

    标签: java multithreading concurrency


    【解决方案1】:

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

    • 如果先写入,happens-before 保证读取将看到新值。
    • 如果读取是第一个,则使用最近的较早写入的发生前发生保证读取将看到该写入的值。

    【讨论】:

      【解决方案2】:

      happens-before 关系在 Java 规范中具有极其特殊的含义。 Oracle 提供了in their concurrency tutorial 含义的概述。

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-05
          • 2020-03-20
          • 2011-05-25
          • 1970-01-01
          • 1970-01-01
          • 2014-02-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多