Java 8 为sun.misc.Unsafe
.
阅读他们的文档后,我感到很困惑。
所以,我在网上搜索,找到了这个链接。
根据上面的页面,我相信这些方法在实践中几乎没有添加任何东西。如果我错了,请纠正我,粗略地说,loadFence()、storeFence() 和 fullFence() 分别对应于 volatile read、lazy write 和 volatile write,尽管从技术上讲,这些栅栏比 volatile 变量更强大。所以 loadFence() 是一个获取栅栏, storeFence() 是一个释放栅栏,而 fullFence() 是完整栅栏。
但是 storeFence() 的文档看起来很奇怪。
它说,
/**
* Ensures lack of reordering of stores before the fence
* with loads or stores after the fence.
*/
void storeFence();
这看起来不像是释放围栏。它应该如何使用?难道不应该
/**
* Ensures lack of reordering of loads or stores before the fence
* with stores after the fence.
*/
void storeFence();
我假设之前意味着更早,之后意味着更晚。
编辑
当我说这些“围栏在实践中没有添加任何内容”时,我并不是说“我们不会在通常的开发中使用它们”。
我的意思是,即使在 Unsafe 中没有这些方法,我们也可以获得这些“栅栏”。如果我是正确的,在实践中,读取虚拟 volatile 具有 loadFence() 的效果,写入虚拟 volatile 具有 fullFence() 的效果,而 unsafe.putOrderedXXX()(或 AtomicInteger.lazySet())具有效果storeFence() 的。
它们可能有细微的差别,但在当前的实现中,它们是可交换的。(似乎由链接暗示)
这就是我所说的“他们没有添加任何新内容”的意思。
另一个编辑
这已经修复了。
见https://bugs.openjdk.java.net/browse/JDK-8038978
谢谢@john-vint