在 Java 9 中还可以使用 sun.misc.Unsafe 吗?

Mar*_*ger 0 java reflection unsafe native java-9

在 Java 8 之前,可以sun.misc.Unsafe通过如下方法获取单例实例:

public static Unsafe getUnsafe() {
    try {
        Field f = Unsafe.class.getDeclaredField("theUnsafe");
        f.setAccessible(true);
        return (Unsafe) f.get(null);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

尽管强烈建议不要使用Unsafe,但许多供应商和图书馆在内部使用它。

现在,有了 Java 9 和 Jigsaw,我认为Unsafe处理方式也发生了变化。我读了一些带有相反信息的帖子。有人说它已完全隐藏,甚至无法检索,有人说必须启用 VM 标志,而另一些人则写道它现在应该得到正式支持。

那么:是否仍然可以sun.misc.Unsafe在 Java 9 中使用?如果可以,如何使用?

Eug*_*ene 5

不仅获取方式保持不变,而且还增加了更多的方法。问题是,现在这是一个承诺,它将在未来某个时候被删除;这次是肯定的。

现在还有两个,一个 :sun.misc.Unsafejdk.internal.misc.Unsafe。顺便说一句,第一个是要删除的。

第二个也可以在 java-9 中获得,但只能使用特殊密钥addExports:java.base/jdk.internal.misc=ALL-UNAMED(但强烈建议不要这样做)。

发生变化的是,许多公共方法已被修补或添加,以便您不再需要使用它,例如,AtomicInteger#weakCompareAndSet它没有执行您期望的操作。