【发布时间】:2017-10-27 17:46:57
【问题描述】:
据说可以用volatile变量来实现同步。但是,易失性变量仍然容易受到内存一致性错误的影响。为什么会这样?
【问题讨论】:
-
嗯?你可以说得更详细点吗?具体有哪些错误?如果您只是问“仅使用 volatile 进行所有同步会出现哪些问题”,那么这对于 SO 来说太宽泛了。
标签: java concurrency synchronized
据说可以用volatile变量来实现同步。但是,易失性变量仍然容易受到内存一致性错误的影响。为什么会这样?
【问题讨论】:
标签: java concurrency synchronized
【讨论】:
No volatile 变量本身不受内存一致性错误的影响。易失性变量建立了内存屏障并尊重发生前的关系,因此写入被刷新到主内存,以便读取是一致的。 操作需要原子。
假设 i 是 int。
i=10 没问题
i++ 不是原子的,它相当于读取当前值递增它然后推送它。
对于boolean 变量,唯一合理的操作是赋值,因此可以一致地使用它们。
再次是需要原子的操作。
【讨论】:
b = !b 呢?那不是类似于i++吗?