1、用什么操作内存?
2、怎么用呢?
如果我们打开这个Unsafe类,你很可能会这样获取,
但是这样获取不到的,因为这个方法是Caller敏感的,看代码
从代码中我们发现,只有当前调用这个getUnsafe()方法的类的ClassLoader==null 才可以正常使用,ClassLoader==null意味着调用这个方法的类是jdk中C代码加载的,这里不赘述。
正确的使用方式:使用反射获取,看代码
3、使用Unsafe 操作成员变量
以上是unsfae.get*()和unsafe.put*() 等操作变量的方法,具体unsfae.get*Volatile(),unsfae.put*Volatile(),只不多是多Volatile语义,关于Volatile 具体可以查看
https://www.ibm.com/developerworks/cn/java/j-jtp06197.html
4、操作数组
如代码操作数组,非常高效,在jdk内部用的非常多,比如ConcurrentHashMap里就用到了
注:UnsafeObject这个类在第3点里
5、内存操作
6、使用场景
一般的话,讲究极致性能的,我们可以使用unsafe,比如netty,就用到了。但是如果使用的话要兼容各个版本的jdk。在业务系统里,不建议使用,如果搞不到很可能导致内存泄露。
7、总结
这个类还没完全分析完,有待更新
为什么要写这个?
主要是在分析ConcurrentHashMap代码时遇到Unsafe,所以就想分析分析,为分析ConcurrentHashMap做准备。
如果想了解ConcurrentHashMap,请关注,后续持续更新。
代码地址:https://github.com/tingliu9/basic-test/blob/master/src/test/java/com/github/tingliu/basic/test/UnsafeTest.java
jdk版本:jdk7_75
如果不对,请赐教!
持续更新有意思的代码
领取专属 10元无门槛券
私享最新 技术干货