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类可以直接操作内存,这是不安全的...但是我们又想这么做只能走野路子了.

万能的反射,我们来了,反射很简单,就不在此多语了

与君共勉....

上一篇下一篇

猜你喜欢

热点阅读