HW小兵Unsafe操作(一):Unsafe实现队列的put

简介

Unsafe是在sun.misc包下的一个类,可以直接绕过JVM操作堆外内存,拥有极高的性能,但在使用中稍有不慎就会引发内存泄漏,程序崩溃,因此在常见的Java业务代码中几乎看不到Unsafe的身影。

    如果有看过atomic包下的类,如AtomicInteger, AtomicLong等源码,其实还是可以找到Unsafe的身影

原子类的CAS方法就依赖了Unsafe的实现。

下面将介绍如何用Unsafe来实现一个队列的基本功能。

队列实现

Unsafe最基本操作

如上代码,首先需要为数据申请一块内存,如存放的类型为long,则需要申请8个字节,然后将内存清空(其实也没有必要,因为long型数据一定会消耗完这8个字节),最后将数据放入申请的地址中;调用getLong方法可以获取该地址存放的实际的值。

定义数据结构

除了META_CAPS之外,其他的通过注释都能理解,META_CAPS的大小为16个字节,及8 + 8,第一个8字节用于存放数据地址,第二个8个字节指向下一个节点,具体流程如下图:

put、poll、size方法实现

性能测试

用2000W个long型数据进行测试,得到的结果如下:

可以看到UnsafeQueue的put操作是快于普通的Queue的,但poll性能不太理想,究其原因是在 poll()中进行了释放内存这一操作,将改行代码注释掉后,性能与普通queue的性能相当:

其实内存的频繁创建与销毁都会带来性能的损耗,之后会慢慢给出相对应的解决方法。

#Java后端实战项目##技术栈##华为##互联网#
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 12:10
点赞 评论 收藏
分享
头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务