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后端实战项目##技术栈##华为##互联网#
全部评论

相关推荐

把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务