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)
有人知道更好的来源吗?
【问题讨论】:
我对@987654327@ 类的理解是,它们特别没有记录/不受支持。您不应该使用它们,因为没有他们同意坚持的已发布 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 记录在哪里? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
找不到方法 sun.misc.Unsafe.defineClass