如何使用Unsafe類呢?
方式一:通過Unsafe提供的Factory 方法。
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: Unsafeat 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);}