JAVA高性能内存队列-disruptor

JAVA高性能内存队列-disruptor

JAVA内置队列

image.png

高性能内存队列-disruptor

image.png

disruptor为啥这么快

无锁设计

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

伪共享问题解决

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


image.png

如何解决?

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

数组实现

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

你可能感兴趣的:(JAVA高性能内存队列-disruptor)