仅发布形式的 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' 排序保证。
我不小心从 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' 排序保证。