sun.misc.Unsafe文档在哪里可以找到?

74

有人知道关于sun.misc.Unsafe的全面文档吗?

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

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

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

有没有人知道更好的来源?


9
sun.* 类的理解是它们是明确未记录/不支持的。你不应该使用它们,因为没有公开的 API 可供使用,也没有保证会遵守的语义。因此,唯一的文档是非官方的 - 使用时需自担风险。 - Andrzej Doyle
2
请注意 - 它应该在Java 9中被删除 - http://blog.dripstat.com/removal-of-sun-misc-unsafe-a-disaster-in-the-making - Eyal
2
这是一篇相当具有煽动性的博客文章。毫不奇怪,该文章所宣扬的“绝对灾难”正在得到解决。当前提案将默认保留sun.misc.Unsafe和其他一些类,如sun.misc.Signal - dimo414
2个回答

67

在mishadoff的博客上有一篇关于此的很好的文章,在这里

尽管该类没有官方文档。


19
这个类的源代码附带了相当多的文档:http://www.docjar.com/html/api/sun/misc/Unsafe.java.html - Rafael Winterhalter
2
@raphw 这是针对OpenJDK的,开发人员必须比Oracle更开放思维。感谢提供链接,非常方便。 - jlr
3
其他JDK可能甚至不提供sun.misc.Unsafe,因为它是一个内部类。那些提供该类的JDK通常会选择相同的实现。即使是Android也有一个具有相同“公共”API的实现。 - Rafael Winterhalter
很抱歉,链接出现了错误。 - Aliaxander
@Aliaxander现在似乎工作正常。 - mwerschy

9
关于putOrdered方法..
您可以调用此方法来设置易失性字段而无需使用易失性存储.. 如果执行易失性存储,您基本上会有一个存储内存屏障,该屏障确保屏障之前的所有存储指令都在屏障之前发生,并且通过确保数据传播到缓存子系统使内存可见. . 因此,当您拥有易失性存储时,必须等待存储缓冲区排空.. 使用putOrdered,线程将不会等待存储缓冲区排空,这可以提高性能.. 但是,作为后果,存储的值不会立即对其他线程可见..
如果您查看AtomicLong(或其他Atomic类),则有一个lazySet方法,实际上执行了putOrderedLong. 此方法的javadoc如下:

最终设置为给定值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接