JAVA高性能内存队列-disruptor

清疚 2022-11-15 11:14 362阅读 0赞

JAVA内置队列

14083d9145d310f5ab9bc5ed0a658405.png

高性能内存队列-disruptor

108f87fb9d085299131f193559a40ef9.png

disruptor为啥这么快

无锁设计

内部采用CAS方式获取下一个任务序列号,没有锁竞争,不需要线程上下文切换

伪共享问题解决

当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能。

0088e3f4b07c511d3908fab54ed72931.png

如何解决?

  • 缓冲行填充,增大数组元素的间隔使得不同线程存取的元素唯一不同的缓存行上,以空间换时间,避免伪共享。
  • 缓存行大小一般是64个字节,然后在序列号变量左右各自填充7个long比那里,来确保任务序列号自己独占一个处理器缓存行。

数组实现

  • 底层数组实现,下标访问,速度快,时间复杂度O(1)。
  • 采用事件对象预填充数组,发布任务时只需要获取序列号上的事件对象然后绑定任务即可,可以循环利用数组中的事件对象,减少垃圾回收。
  • 数组长度固定为2^n,通过位运算,加快定位的速度。

发表评论

表情:
评论列表 (有 0 条评论,362人围观)

还没有评论,来说两句吧...

相关阅读

    相关 高性能队列——Disruptor

    背景 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Dis