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

Is it still possible to use sun.misc.Unsafe in 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;
}

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

现在,有了 Java 9 和 Jigsaw,我认为 Unsafe 的处理方式也发生了变化。我读了一些带有相反信息的帖子。有的说已经完全隐藏了,甚至都找不回来了,有的说得开VM flag,还有的写现在官方应该支持了。

所以:是否可以在 Java9 中仍然使用 sun.misc.Unsafe,如果可以,如何使用?

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

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

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

发生变化的是,许多 public 方法已被修补或添加,因此您不再需要使用它,例如 AtomicInteger#weakCompareAndSet 没有做什么你会期望。