gpt4 book ai didi

Java Unsafe.storeFence() 文档错误?

转载 作者:搜寻专家 更新时间:2023-10-30 21:31:57 27 4
gpt4 key购买 nike

Java 8 为 sun.misc.Unsafe 添加了三个栅栏。

在阅读他们的文档后,我感到很困惑。

所以,我在网上搜索,找到了这个 link .

根据上面的页面,我相信这些方法在实践中几乎没有增加任何内容。如果我错了请纠正我,粗略地说,loadFence()、storeFence() 和 fullFence() 分别对应于 volatile read、lazy write 和 volatile write,尽管从技术上讲这些栅栏比 volatile 变量更强。所以loadFence()是acquire fence,storeFence()是release fence,fullFence()是full fence。

但是 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();

我假设 before 表示较早,after 表示较晚。

编辑

当我说这些“围栏在实践中没有添加任何东西”时,我并不是说“我们不在通常的开发中使用它们”。

我的意思是,即使在 Unsafe 中没有这些方法,我们也可以获得这些“栅栏”。如果我是正确的,在实践中,读取虚拟 volatile 具有 loadFence() 的效果,写入虚拟 volatile 具有 fullFence() 的效果,而 unsafe.putOrderedXXX()(或 AtomicInteger.lazySet())具有效果storeFence() 的。

它们可能有细微的差别,但在当前的实现中,它们是可以互换的。 (似乎由链接暗示)

这就是我所说的“他们没有添加任何新内容”的意思。

另一个编辑

这已经修复了。

参见 https://bugs.openjdk.java.net/browse/JDK-8038978

谢谢@john-vint

最佳答案

在 JDK9 中实际上有一个 diff。提出并澄清了类似的问题:

http://hg.openjdk.java.net/jdk9/jdk9/jdk/rev/84e19392365e

      /**
! * Ensures that loads before the fence will not be reordered with loads and
! * stores after the fence; a "LoadLoad plus LoadStore barrier".
! *
! * Corresponds to C11 atomic_thread_fence(memory_order_acquire)
! * (an "acquire fence").
! *
! * A pure LoadLoad fence is not provided, since the addition of LoadStore
! * is almost always desired, and most current hardware instructions that
! * provide a LoadLoad barrier also provide a LoadStore barrier for free.
* @since 1.8
*/
public native void loadFence();

/**
! * Ensures that loads and stores before the fence will not be reordered with
! * stores after the fence; a "StoreStore plus LoadStore barrier".
! *
! * Corresponds to C11 atomic_thread_fence(memory_order_release)
! * (a "release fence").
! *
! * A pure StoreStore fence is not provided, since the addition of LoadStore
! * is almost always desired, and most current hardware instructions that
! * provide a StoreStore barrier also provide a LoadStore barrier for free.
* @since 1.8
*/
public native void storeFence();

/**
! * Ensures that loads and stores before the fence will not be reordered
! * with loads and stores after the fence. Implies the effects of both
! * loadFence() and storeFence(), and in addition, the effect of a StoreLoad
! * barrier.
! *
! * Corresponds to C11 atomic_thread_fence(memory_order_seq_cst).
* @since 1.8
*/
public native void fullFence();

关于Java Unsafe.storeFence() 文档错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30600621/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com