JAVA内置队列
高性能内存队列-disruptor
disruptor为啥这么快
无锁设计
内部采用CAS方式获取下一个任务序列号,没有锁竞争,不需要线程上下文切换
伪共享问题解决
当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能。
如何解决?
- 缓冲行填充,增大数组元素的间隔使得不同线程存取的元素唯一不同的缓存行上,以空间换时间,避免伪共享。
- 缓存行大小一般是64个字节,然后在序列号变量左右各自填充7个long比那里,来确保任务序列号自己独占一个处理器缓存行。
数组实现
- 底层数组实现,下标访问,速度快,时间复杂度O(1)。
- 采用事件对象预填充数组,发布任务时只需要获取序列号上的事件对象然后绑定任务即可,可以循环利用数组中的事件对象,减少垃圾回收。
- 数组长度固定为2^n,通过位运算,加快定位的速度。