Unsafe练习
2019-07-05 本文已影响0人
孤独而无用
今天看了一下rt.jar包提供的Unsafe类的使用,因为这个可以直接操作内存,是不是很diao? 直接上代码:
//获取Unsafe的实例
static final Unsafe unsafe = Unsafe.getUnsafe();
//记录变量statue在类Test的偏移值
static long stateOffset;
private volatile long state = 0;
static {
try {
stateOffset = unsafe.objectFieldOffset(Test.class.getDeclaredField("state"));
} catch (Exception e) {
System.out.println(e.getLocalizedMessage());
throw new Error(e);
}
}
public static void main(String[] args) {
Test test = new Test();
Boolean sucess = unsafe.compareAndSwapInt(test, stateOffset, 0, 1);
System.out.println(sucess);
}
java.lang.ExceptionInInitializerError
Caused by: java.lang.SecurityException: Unsafe
at sun.misc.Unsafe.getUnsafe(Unsafe.java:90)
at com.huifu.lens.util.Test.<clinit>(Test.java:7)
Exception in thread "main"
直接报错了,查了资料发现,Unsafe.getUnsafe()调用实例化的时候会判断是不是Bootstrap类加载器加载的localClass, 而我们启动main函数所在的类是用AppClassLoader加载的,所以根据委托机制,会委托给Bootstrap去加载Unsafe类.
查了资料是JDK开发组故意做的这个限制,因为Unsafe类可以直接操作内存,这是不安全的...但是我们又想这么做只能走野路子了.
万能的反射,我们来了,反射很简单,就不在此多语了
与君共勉....