java未开源的Unsafe类

如何使用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);
	}

 

 


posted @ 2012-02-20 11:27  focusJ  阅读(5390)  评论(1编辑  收藏  举报