【发布时间】: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