Unsafe类

  这两天看netty源码看到一些UnpooledUnsafeHeapByteBuf、UnpooledUnsafeDirectByteBuf等一些使用了Unsafe类的ByteBuf。于是就网上看了一下这个Unsafe类,网上的资料都在说Unsafe类是一个不安全的类,它可以里面很多的native函数,能直接访问虚拟机内存,不建议在自己的代码里面使用。不建议使用的原因还有一个,就是Unsafe类在Java9中可能会被移除,但是我刚刚去翻了一下java9的代码,发现并没有被移除,反而在jdk.internal.misc包中新增了一个Unsafe类(原来的Unsafe类在sun.misc包下面),而且之前只能通过反射去获取Unsafe类的实例,在jdk.internal.misc.Unsafe可以直接通过getUnsafe()函数获取。

  java8获取Unsafe类实例

    public static Unsafe getUnsafe() throws Exception {
        Field field = Unsafe.class.getDeclaredField("theUnsafe");
        field.setAccessible(true);
        Unsafe unsafe = (Unsafe) field.get(null);
        return unsafe;
    }

  java9获取Unsafe类实例(通过jdk.internal.misc.Unsafe的静态方法getUnsafe()获取)

    public static Unsafe getUnsafe() {
        return theUnsafe;
    }

  利用Unsafe实例可以实现一些有趣的事情,比如创建一个对象但是不初始化它、又或者抛出一个check exception但是你的代码不需要去catch或者throw这个异常等。
  详细的使用可以看这篇文章http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe(英文的,我是想着给它翻译一遍,但是翻译到一半感觉对有些概念我还是翻译不清楚,所以就不贴出来误导大家了,大家还是去看原文吧,哈哈哈哈)
  另外不想看英文的可以看这篇中文的https://www.cnblogs.com/throwable/p/9139947.html
,他是根据上面那篇英文写的,很详细,向大佬学习

你可能感兴趣的:(Unsafe类)