美文网首页
Unsafe练习

Unsafe练习

作者: 孤独而无用 | 来源:发表于2019-07-05 20:41 被阅读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类可以直接操作内存,这是不安全的...但是我们又想这么做只能走野路子了.

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

    与君共勉....

    相关文章

      网友评论

          本文标题:Unsafe练习

          本文链接:https://www.haomeiwen.com/subject/rhjyhctx.html