解析java9中的Unsafe

版权声明:本文为博主原创文章,转载请注明出处,谢谢!

版权声明:本文为博主原创文章,转载请注明出处:http://blog.jerkybible.com/2018/01/18/解析java9中的Unsafe/

访问原文「解析java9中的Unsafe

写在前面

关于Unsafe我之前写过一个文章Unsafe类初探,有兴趣的话可以先看下。这里先说一下这个类的重要性吧。

其实在一般的应用中这个类并没有作用,但是在一些场景下它是不可替代的,这里可以举一个常见的例子。我们都知道JavaC++C不同,可以说是最大的不同,是没有办法直接操作内存,默认都是由JVM进行内存分配和垃圾回收,但是这种方式往往在垃圾回收时由于STW太长导致服务短暂或较长时间停止,而且这种问题即使调JVM参数也无法根本的解决,甚至无任何好转。但是使用Unsafe,我们即使在Java中也可以手动操作内存,这样可以大大减少垃圾回收时间而且可以减少堆内内存的使用。

但是一直有传言,java9的时候将会把这个类删除,这是个灾难性的消息,因为有很多应用现在依赖于它。不过就目前的java9版本来看这个类并没有删除,而且还更加易于使用。

Unsafe的变化

包路径

1.8之前Unsafe的包路径为:

1
package sun.misc;

而到了java9,它的包路径改成了下面这个,说明这个类已经开放使用。

1
package jdk.internal.misc;

获取Unsafe实例方式

1.8之前Unsafe是不公开的类,只能通过反射或者使用系统类加载器使用,利用反射的使用方式如下。这里不再详细分析。

1
2
3
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);

而到了java9,Unsafe包含了一个静态方法,可以直接拿到theUnsafe对象。如下。

1
2
3
4
5
6
/**
* 给调用者提供执行不安全操作的能力
*/
public static Unsafe getUnsafe() {
return theUnsafe;
}

注释

1.8之前Unsafe是没有注释的,但是在java9中给予了非常详细的注释,这里不贴图做比较了。

写在最后

我并没有实际测试,只是将之前一个包装了Unsafe的工具类拷贝到了java9环境中,没有报什么错误,目测可以兼容使用。如果你们发现了有什么使用上的不同可以留言。

Jerky Lu wechat
欢迎加入微信公众号