为何Disruptor不使用队列来实现RingBuffer
队列有两个指针,一个指向队头,一个指向队尾。若是有超过一个生产者想要往队列里放东西,尾指针就将成为一个冲突点,由于有多个线程要更新它。若是有多个消费者,那么头指针就会产生竞争,由于元素被消费以后,须要更新指针,因此不只有读操做还有写操做了。因此队列一般是单生产者单消费者。
队列(缓冲区)的目的就是为生产者和消费者提供一个地方存放要交互的数据,缓冲它们之间传递的消息。这意味着缓冲区一般是满的(生产快于消费)或是空的(消费快于生产)。生产者和消费者协调一致的状况很是少见。
这就是咱们所说的“分离竞争点问题”或者队列的
“合并竞争点问题”。经过将全部的东西都赋予私有的序列号,而且只容许一个消费者写Entry对象中的变量来消除竞争,Disruptor 惟一须要处理访问冲突的地方,是多个生产者写入 Ring Buffer 的场景。
Cache Line:cache line解释起来其实很简单,就是CPU在作缓存的时候有个最小缓存单元,在同一个单元内的数据被同时被加载到缓存中,充分利用 cache line能够大大下降数据读写的延迟,错误利用cache line也会致使缓存不一样替换,反复失效。
根据CPU的缓存机制,若是你访问一个long数组,当数组中的一个值被加载到缓存中,它会额外加载另外7个。所以你能很是快地遍历这个数组。
总结
Disruptor 为何这么快?
两个核心思想:
- 计算机计算的速度远远大于 IO 的速度,宁肯增长一些处理代码加大计算压力,也要尽量多的使用缓存而非内存。
- 锁是阻碍并发效率的元凶,尽量的避免竞争,经过合理的分配策略+内存屏障机制,实现真正的并发处理。
Disruptor相对于传统方式的优势:
- 缓存行填充
更多并发编程和分布式应用的内容欢迎关注个人博客
LOFTER移动端体验较好,博客园PC端体验较好。