我不小心从 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 的仅发布形式是什么。有人可以对此有所了解吗?
我不小心从 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 的仅发布形式是什么。有人可以对此有所了解吗?
我无法找出 CAS 的仅发布形式是什么。
这指的是C++ 内存模型方面对原子的内存排序约束。其中一些在 C++ 之前的Java 内存模型方面不能完全表达(另请参阅JMM 开发人员食谱),因此它们目前无法通过标准库提供。
这将随着 Java9 的变化而改变,其中varhandles将公开与 C++ 语义匹配的内存访问,消费顺序除外。
另请注意,您链接的 java 类已从 jsr166 存储库复制,这是 JDK juc 包的上游版本。
通常对于易失性写入,您将遇到以下障碍
[StoreStore]
[LoadStore]
x=10
[StoreLoad]
StoreLoad 有 2 个用途:
StoreLoad 可能很昂贵,因为它等待存储缓冲区耗尽。
上面的方法,结合下面的用于读取 X
tmp=x
[LoadLoad]
[LoadStore]
将确保访问 volatile 变量是顺序一致的。
仅发布形式如下所示
[StoreStore]
[LoadStore]
x=10
如您所见,[StoreLoad] 障碍消失了。
在读取方面,它与常规的 volatile 读取相同。
我不知道“仅发布形式的 CAS”如何适合图片
就像已经指出的 8472 一样,Java 9 中的新 VarHandles 将公开宽松的“获取/释放”顺序保证。