【发布时间】:2014-11-16 10:14:34
【问题描述】:
我正在阅读 Hans 的一篇文章,他认为 LoadStore 在lazySet 或最终变量写入之前也需要。
他展示了一个我无法理解的特定比赛条件。
http://www.hboehm.info/c++mm/no_write_fences.html 见 收件人写入对象。
x.a = 43 的线程 1 存储如何通过 StoreStore 屏障完成是非常违反直觉的,因为这样就完全违背了 StoreStore 屏障的目的。
这里有类似的论点http://shipilev.net/blog/2014/all-fields-are-final/
在此处复制 Shiplev:
“JSR 133 Cookbook 仅需要 StoreStore,但可能还需要 LoadStore 屏障。这涵盖了一个极端情况,即 final 字段正在从其他经历激烈更新的字段中初始化。 这种极端情况可以通过运行时优化来启用,它会发现不需要最终存储,将值放在局部变量中,从而打破 StoreStore 单独的排序保证“
*运行时如何确定不需要最终存储,如果负载正在通过/重新排序 StoreStore 屏障,那么存储到本地变量也正在通过/重新排序与 storeStore 屏障,这是我不需要的部分很明白,为什么store to local variable可以用StoreStore Barrier重新排序。运行时如何/何时可以确定存储到局部变量就足够了 *
如果有人可以通过一些简单的例子更详细地解释他们都提到的竞争条件是什么,那将是非常有帮助的。
【问题讨论】:
标签: java performance concurrency compiler-optimization volatile