欢迎移步到我的个人博客
写在前面
关于Unsafe
我之前写过一个文章Unsafe类初探,有兴趣的话可以先看下。这里先说一下这个类的重要性吧。
其实在一般的应用中这个类并没有作用,但是在一些场景下它是不可替代的,这里可以举一个常见的例子。我们都知道Java
与C++
、C
不同,可以说是最大的不同,是没有办法直接操作内存,默认都是由JVM
进行内存分配和垃圾回收,但是这种方式往往在垃圾回收时由于STW
太长导致服务短暂或较长时间停止,而且这种问题即使调JVM
参数也无法根本的解决,甚至无任何好转。但是使用Unsafe
,我们即使在Java
中也可以手动操作内存,这样可以大大减少垃圾回收时间而且可以减少堆内内存的使用。
但是一直有传言,java9的时候将会把这个类删除,这是个灾难性的消息,因为有很多应用现在依赖于它。不过就目前的java9版本来看这个类并没有删除,而且还更加易于使用。
Unsafe的变化
包路径
1.8之前Unsafe
的包路径为:
package sun.misc;
而到了java9,它的包路径改成了下面这个,说明这个类已经开放使用。
package jdk.internal.misc;
获取Unsafe实例方式
1.8之前Unsafe
是不公开的类,只能通过反射或者使用系统类加载器使用,利用反射的使用方式如下。这里不再详细分析。
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
而到了java9,Unsafe
包含了一个静态方法,可以直接拿到theUnsafe
对象。如下。
/**
* 给调用者提供执行不安全操作的能力
*/
public static Unsafe getUnsafe() {
return theUnsafe;
}
注释
1.8之前Unsafe
是没有注释的,但是在java9中给予了非常详细的注释,这里不贴图做比较了。
写在最后
我并没有实际测试,只是将之前一个包装了Unsafe
的工具类拷贝到了java9环境中,没有报什么错误,目测可以兼容使用。如果你们发现了有什么使用上的不同可以留言。
欢迎加入微信公众号