11

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

4

2 回答 2

6

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

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();
于 2015-06-02T16:47:32.260 回答
0

我相信这些方法在实践中几乎没有增加任何东西。

正确,他们不会在 99.9% 的应用程序中添加任何内容。只有在非常特定的情况下才需要直接调用此方法而不是使用更高级别的构造。

分别为 volatile read、lazy write 和 volatile write,

我将其读为“易失性读取、易失性写入、易失性写入和读取” 似乎没有惰性/有序写入围栏。

loadFence() 是获取栅栏,storeFence() 是释放栅栏,

我不相信这些会转化为获取/释放语义。它们比这更基本。例如,这些方法中没有状态变化。获取/释放需要一个原子操作,例如 compareAndSet ,这是另一种不安全的方法。

于 2015-06-02T15:52:49.400 回答