【问题标题】:Where is sun.misc.Unsafe documented? [closed]sun.misc.Unsafe 记录在哪里? [关闭]
【发布时间】:2013-05-25 00:41:41
【问题描述】:

有人知道sun.misc.Unsafe 的任何综合文档吗?

我正在寻找有关 Unsafe.putOrderedInt() 的文档。我只能找到This

public native  void putOrderedInt(Object o,
    long offset,
    int x)

     Ordered/Lazy version of #putIntVolatile(Object, long, int) 

有人知道更好的来源吗?

【问题讨论】:

  • 我对@9​​87654327@ 类的理解是,它们特别没有记录/不受支持。您不应该使用它们,因为没有他们同意坚持的已发布 API,或者他们保证将保持的语义。因此,唯一的文档是非官方的也就不足为奇了 - 使用风险自负。
  • 注意 - 它应该在 Java 9 中被删除 - blog.dripstat.com/…
  • 那是一篇颇具煽动性的博文。不出所料,该帖子令人恐惧的“绝对灾难”正在得到解决。 current proposal 将保留 sun.misc.Unsafe 和其他一些类,例如 sun.misc.Signal,默认情况下可用。

标签: unsafe java


【解决方案1】:

mishadoff 的博客 here 上有一篇很好的帖子。

虽然该类没有正式记录。

【讨论】:

  • 类的源代码附有相当多的文档:docjar.com/html/api/sun/misc/Unsafe.java.html
  • @raphw 虽然这是针对 OpenJDK 的,但开发人员必须比 Oracle 更开放。感谢您的链接,它非常方便。
  • 其他 JDK 甚至可能不提供 sun.misc.Unsafe,因为它是一个内部类。不过,提供该类的 JDK 通常会选择相同的实现。甚至 Android 也有一个具有相同“公共”API。
  • 很遗憾链接已损坏。
  • @Aliaxander 现在似乎工作正常。
【解决方案2】:

关于 putOrdered 方法..

您可以调用此方法来设置 volatile 字段,而无需使用 volatile 存储。如果您执行 volatile 存储,则基本上有一个存储内存屏障,可确保所有存储指令在屏障之前发生,在屏障和内存之前发生通过确保将数据传播到缓存子系统是可见的。因此,当您拥有易失性存储时,您必须等待存储缓冲区耗尽。使用 putOrdered 线程执行不会等待存储缓冲区以耗尽,这可以提高性能.. 但是,因此存储的值将不会立即对其他线程可见..

如果您查看 AtomicLong(或其他 Atomic 类),则有一个实际执行 putOrderedLong 的 lazySet 方法。这个方法的javadoc是:

最终设置为给定值。

【讨论】:

    猜你喜欢
    • 2013-02-21
    • 2011-04-15
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多