sun.misc.Unsafe 记录在哪里? [关闭]

Posted

技术标签:

【中文标题】sun.misc.Unsafe 记录在哪里? [关闭]【英文标题】:Where is sun.misc.Unsafe documented? [closed] 【发布时间】: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,默认情况下可用。 【参考方案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是:

最终设置为给定值。

【讨论】:

以上是关于sun.misc.Unsafe 记录在哪里? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

java的sun.misc.Unsafe类

找不到方法 sun.misc.Unsafe.defineClass

如何获取 sun.misc.Unsafe 的实例?

在 Java 9 中删除 sun.misc.Unsafe 将破坏 Spring、Hibernate

sun.misc.unsafe

Understanding sun.misc.Unsafe