6

我不小心从 Kamon 监控工具中遇到了Striped64.java类。在第 95 行,我发现了这条评论:

JVM intrinsics note: It would be possible to use a release-only
form of CAS here, if it were provided.

虽然我了解 CAS 是什么,但我无法找出CAS 的仅发布形式是什么。有人可以对此有所了解吗?

4

2 回答 2

4

我无法找出 CAS 的仅发布形式是什么。

这指的是C++ 内存模型方面对原子的内存排序约束。其中一些在 C++ 之前的Java 内存模型方面不能完全表达(另请参阅JMM 开发人员食谱),因此它们目前无法通过标准库提供。

这将随着 Java9 的变化而改变,其中varhandles将公开与 C++ 语义匹配的内存访问,消费顺序除外。

另请注意,您链接的 java 类已从 jsr166 存储库复制,这是 JDK juc 包的上游版本。

于 2017-02-01T13:00:15.637 回答
2

通常对于易失性写入,您将遇到以下障碍

[StoreStore]
[LoadStore]
x=10
[StoreLoad]

StoreLoad 有 2 个用途:

  • 它可以防止较新的负载浮动到 x=10 以上。
  • 它使在“x=10”之前发生的所有更改在其他处理器上可见。

StoreLoad 可能很昂贵,因为它等待存储缓冲区耗尽。

上面的方法,结合下面的用于读取 X

tmp=x
[LoadLoad]
[LoadStore]

将确保访问 volatile 变量是顺序一致的。

仅发布形式如下所示

[StoreStore]
[LoadStore]
x=10

如您所见,[StoreLoad] 障碍消失了。

在读取方面,它与常规的 volatile 读取相同。

我不知道“仅发布形式的 CAS”如何适合图片

就像已经指出的 8472 一样,Java 9 中的新 VarHandles 将公开宽松的“获取/释放”顺序保证。

于 2017-02-17T06:42:16.987 回答