在 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.Unsafe
和jdk.internal.misc.Unsafe
。第一个是要删除的那个。
第二个也可以在 java-9 中获得,但只能使用特殊密钥 addExports:java.base/jdk.internal.misc=ALL-UNAMED
(但强烈建议不要这样做)。
发生变化的是,许多 public 方法已被修补或添加,因此您不再需要使用它,例如 AtomicInteger#weakCompareAndSet
没有做什么你会期望。
直到 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.Unsafe
和jdk.internal.misc.Unsafe
。第一个是要删除的那个。
第二个也可以在 java-9 中获得,但只能使用特殊密钥 addExports:java.base/jdk.internal.misc=ALL-UNAMED
(但强烈建议不要这样做)。
发生变化的是,许多 public 方法已被修补或添加,因此您不再需要使用它,例如 AtomicInteger#weakCompareAndSet
没有做什么你会期望。