disruptor的优缺点:
- 没有竞争=没有锁=非常快。
- 所有访问者都记录自己的序号的实现方式,允许多个生产者与多个消费者共享相同的数据结构。
- 在每个对象中都能跟踪序列号(ring buffer,claim Strategy,生产者和消费者),加上神奇的cache line padding,就意味着没有为伪共享和非预期的竞争。
Disruptor 为什么快
1. 不使用锁。通过内存屏障和原子性的CAS操作替换锁。(CAS是CPU级别的指令,更加轻量,不需要像Lock一样需要OS的支持,sequence支持CAS操作;最后,为了提高效率,Sequence通过padding来避免伪共享。)
2. 缓存基于数组而不是链表,用位运算替代求模。缓存的长度总是2的n次方,这样可以用位运算 i & (length - 1) 替代 i % length。
3. 去除伪共享。CPU的缓存一般是以缓存行为最小单位的,对应主存的一块相应大小的单元;当前的缓存行大小一般是64字节,每个缓存行一次只能被一个CPU核访问,如果一个缓存行被多个CPU核访问,就会造成竞争,导致某个核必须等其他核处理完了才能继续处理,响应性能。去除伪共享就是确保CPU核访问某个缓存行时不会出现争用。
4.预分配缓存对象,通过更新缓存里对象的属性而不是删除对象来减少垃圾回收。