所谓的ringbuffer,就是一个环形队列。我们来看看为了解决这两个问题他是如何做的。
1. 一个环形队列,意味着首尾相连,也就是他的大小是有限制的,但是ringbuffer是基于这样一个假设:即生产者和消费者都在同步往前走,不存在某边特别快,这样这个对列就可以循环使用,不必有创建对象的开销,另外,ringbuffer由于是固定大小的,使用数组来保存,由于预先分配好了空间,所以定位和查找的速度自然不必说。所以它自然的解决了第一个问题。但是如果实际使用中确实是生产者快于消费者(或者反过来)呢?也就是说,在某个时间点,他们一定会首尾相遇,这时候会发生什么呢?这个问题我们随后解释。
2.为了让队列安全的在多线程环境运行,需要整个队列上锁,带来的开销是巨大的。来看ringbuffer是如何无锁的(简化起见,讨论一个生产者一个消费者的情况)。为了解释这个原理,这里借用别人的图来阐述这个问题。比如目前有一个consumer,停留在位置12,这时producer假设在位置3,这时producer的下一步是如何处理的呢?producer会尝试读取4,发现没有到下一个consumer,所以可以安全获取,于是将之改为14,并且将产品publish到14,并且通知一个阻塞的consumer起来活动。如此一直到11都是安全的(这里我们假设生产者比较快),当producer尝试访问12时发现不能继续,于是交出控制权;而consumer开始移动时,会调用barrier的waitFor方法,waitFor看到前面最近的安全节点已经到了20(21是producer),于是直接返回20,所以现在consumer可以无锁的去消费13到20的所有产品,可以想象,这种方式比起synchronized要快上很多倍。

参考:disruptor架构:
disruptor文章集合:
disruptor性能测试:https://code.google.com/p/disruptor/wiki/PerformanceResults
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-26630-2.html
确实如此
人家是一个国家凭什么不能有武装
最喜欢易烊千玺