【问题标题】:Why we must use same volatile field to establish happens-before relationship using the volatile keyword?为什么我们必须使用相同的 volatile 字段来使用 volatile 关键字建立发生前的关系?
【发布时间】:2017-10-26 02:42:32
【问题描述】:

'Volatile Rule' 表示“对易失性字段的写入发生在对同一字段的每次后续读取之前”, 我知道这意味着如果我们写入一个易失性线程并在另一个线程中读取另一个易失性,那么这两个操作之间没有发生之前的关系。

我的问题是为什么我们必须使用“相同字段”?

【问题讨论】:

  • 因为这是规则?
  • 如果您写入一个volatile 字段并从另一个字段读取(volatile 与否),则没有“发生前”保证。
  • 它还能说什么呢?关键是要限制必须使最新更改对实际相关人员可见的线程。 Jvm 设计者希望避免在整个程序中更新每个线程的视图。
  • 这是一个规范。特定硬件配置上的特定 JVM 可能有很强的保证,但您不能依赖这些保证,因为在不同或更新版本的 JVM 或其他硬件配置上行为可能会有所不同。至于为什么——您必须询问创建 JMM 规范的团队中的某个人。这是委员会的决定,他们本可以轻松制定不同的规则。
  • @ErwinBolwidtErwin 对于 SO 上的几乎每个问题都可以做出类似的回答:“就是这样”。在这种情况下,我猜想知道happens-before是如何在现有的或合理可能的计算机架构上实现的,这表明happens-before可以比全局happens-before更有效地为一个领域实现,我们可以合理推测 规范编写者希望允许这些有效的实现。

标签: java multithreading concurrency


【解决方案1】:

它应该是这样工作的不是吗?我们想要的只是线程之间共享的数据应该是一致的,那么为什么我们要在不同的变量之间有happens-before关系呢?在同一领域的关系之前发生是有意义的,因为如果我们不这样做,那么它可能会导致数据竞争。不是吗?

【讨论】:

    【解决方案2】:

    因为synchronized 涵盖了您所要求的内容:通过同步方法写入对象的任何字段发生在随后通过同步方法读取同一对象的任何其他字段。

    【讨论】:

    • synchronized 的工作方式与volatile 类似,因为 happens-before 仅在锁定同一监视器的线程之间得到保证。你做错了区分。
    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 2016-02-12
    • 2023-03-08
    • 2010-12-14
    相关资源
    最近更新 更多