【发布时间】:2020-01-30 18:40:37
【问题描述】:
现在我们有
Load A
StoreStore
Store B
有没有可能实际的执行顺序如下
StoreStore
Store B
Load A
如果可能,如何解释似乎违反The Java volatile Happens-Before Guarantee 的情况。
据我所知,volatile语义是使用下面的JMM内存屏障添加策略实现的
insert a StoreStore before volatile variable write operation
insert a StoreLoad after volatile variable write operation
insert a LoadLoad after volatile variable read operation
insert a LoadStore after volatile variable read operation
现在如果我们有两个java线程如下
线程 1
Load A
StoreStore
Store volatile B
线程 2
Load volatile B
Load C
根据“Java volatile Happens-Before Guarantee”,当Load volatile B 在Store volatile B 之后时,Load A 应该在Load C 之前发生,但如果Load A 可以重新排序为“在 Store volatile B 之后” ,Load A is before Load C如何保证?
【问题讨论】:
-
"在 volatile 变量写入操作后插入 StoreLoad" - 不,它插入 LoadStore before volatile 写入操作。因此,在您的示例中,
Load A无法使用以下 Storevolatile B重新排序。
标签: java memory-barriers instruction-reordering