【问题标题】:volatile varible's memory consistence errors?易失性变量内存一致性错误?
【发布时间】:2017-10-27 17:46:57
【问题描述】:

据说可以用volatile变量来实现同步。但是,易失性变量仍然容易受到内存一致性错误的影响。为什么会这样?

【问题讨论】:

  • 嗯?你可以说得更详细点吗?具体有哪些错误?如果您只是问“仅使用 volatile 进行所有同步会出现哪些问题”,那么这对于 SO 来说太宽泛了。

标签: java concurrency synchronized


【解决方案1】:

易失性与同步无关。

易失性变量降低了内存一致性错误的风险,因为对易失性变量的任何写入都会与同一变量的后续读取建立之前发生的关系。

Here is the link to JavaDoc

【讨论】:

  • 在这方面的术语需要小心一点。您所指的发生之前的关系是由于 JLS 所称的“synchronization”。该术语已超载,我不确定 OP 指的是哪个版本(或者他们是否认识到它已超载)。
【解决方案2】:

No volatile 变量本身不受内存一致性错误的影响。易失性变量建立了内存屏障并尊重发生前的关系,因此写入被刷新到主内存,以便读取是一致的。 操作需要原子

假设 i 是 int。

i=10 没问题

i++ 不是原子的,它相当于读取当前值递增它然后推送它。

对于boolean 变量,唯一合理的操作是赋值,因此可以一致地使用它们。

再次是需要原子操作

【讨论】:

  • "对于布尔变量,唯一合理的操作是赋值,因此可以一致地使用它们。" b = !b 呢?那不是类似于i++吗?
  • @yshavit 不错,赶上 yshavit。那就好好使用锁吧,这与内存一致性无关。
  • 非常正确。不幸的是,我仍然不清楚 OP 实际上在问什么。特别是,我不清楚他们指的是单词撕裂还是其他东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 2015-07-26
  • 2023-03-21
  • 2011-02-15
  • 2015-11-03
  • 2013-07-27
相关资源
最近更新 更多