首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

jdk源码(一):你知道用java如何直接操作内存码?

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

如果不对,请赐教!

持续更新有意思的代码

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180209A0NP0700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券