仅发布形式的 CAS

Release-Only form of CAS

我不小心从 Kamon 监控工具 运行 进入了 Striped64.java class。在第 95 行,我发现了这条评论:

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

虽然我了解 CAS 是什么,但我无法找出 仅发布形式的 CAS 是什么。有人能解释一下吗?

I am unable to find out what a release-only form of CAS is.

这指的是 C++ memory model. Some of those are not fully expressible in the terms of the java memory model which predates the C++ one (see also the JMM cookbook for developers) 中对原子的内存排序约束,因此它们目前无法通过标准库获得。

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

另请注意,您链接的 java class 已从 jsr166 存储库复制,它是 JDK j.u.c 的上游版本。包。

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

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

StoreLoad 有两个用途:

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

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

以上的做法,结合下面对X的读取

tmp=x
[LoadLoad]
[LoadStore]

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

仅发布形式看起来像这样

[StoreStore]
[LoadStore]
x=10

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

在读取方面,它与常规的易失性读取相同。

不知道'release-only form of CAS'怎么配上图

并且像 8472 已经指出的那样,Java 9 中的新 VarHandles 将公开宽松的 'acquire/release' 排序保证。