如何使用Unsafe类呢?
方式一:通过Unsafe提供的工厂方法。
Unsafe unsafe = Unsafe.getUnsafe(); 通过这样的方式获得Unsafe的实力会抛出异常信息,因为在unsafe的源码中会有对安全性的检查public static Unsafe getUnsafe() { Class cc = sun.reflect.Reflection.getCallerClass(2); if (cc.getClassLoader() != null) throw new SecurityException("Unsafe"); return theUnsafe; }Exception in thread "main" java.lang.SecurityException: Unsafe at sun.misc.Unsafe.getUnsafe(Unsafe.java:68) at org.wk.core.concurrent.InitUnsafe.main(InitUnsafe.java:12)
方式二:通过反射的方式。
因为在开源版本的Unsafe.java中声明了一个实例域,所以我们可以通过反射的方式来获得这个域。
private static final Unsafe theUnsafe = new Unsafe();//使用方法private static Unsafe getUnsafeInstance() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafeInstance.setAccessible(true); return (Unsafe) theUnsafeInstance.get(Unsafe.class); }