您的位置:首页 > 编程语言 > Java开发

Java并发框架Disruptor实现原理与源码分析(一) 认识Disruptor

2017-01-07 00:00 232 查看
摘要: Disruptor 是一个开源Java高并发开发框架,它通过RingBuffer实现了高效的无锁并发,同时其实现思想与技巧值得我们学习。

Java并发框架Disruptor实现原理与源码分析(一) 认识Disruptor

LMAX Disruptor

Disruptor 是一个开源的Java高并发开发框架,由于其实现核心是环形队列 RingBuffer所以有些人也称其为队列。虽然说Disruptor的实现核心是RingBuffer 但事实上其被用于高并发事件模型,所以从这点上来讲我个人更倾向于称其为并发框架。这样说的原因是Disruptor在面对高并发的生产者与消费者模型时所呈现的高效率与高吞吐能力以及其无锁并发的实现思想。以下摘自Disruptor官方的说法。

The LMAX Disruptor is a high performance inter-thread messaging library. It grew out of LMAX's research into concurrency, performance and non-blocking algorithms and today forms a core part of their Exchange's infrastructure.

RingBuffer

RingBuffer是Disruptor的核心组件,它是一个环形队列。和其他环形队列不同之处是RingBuffer没有尾标识。这也就是说RingBuffer是一个只有头没有尾的环形队列,这似乎听上去有点不太对劲,因为在大家印象里面环形队列应该是有头有尾然后尾有一个指向头的引用,是的你没有听错,它的确是这样。事实上RingBuffer就是一个定长数组,它是通过内存寻址加一个递增的Long型sequence来实现的一个环形队列。也许这个时候你会问那这个sequence不会到最大值吗?当然会到最大值,但是一个Java的long型得最大值是9223372036854775807L ,假设你每天产生一千亿个sequence的话你也能用252695年,所以这个就不要担心啦。使用定长数组好处是数组比其他Java集合更加高效而且可以通过Java的Unsafe实现内存的寻址操作,这也是RingBuffer实现的核心。使用环形队列实现无锁并发这有点类似我们中国南方很多地方使用的水车的原理,所以从这点上来讲“编程就是生活的抽象化”这句话是很有道理的。其实RingBuffer还使用了很多我们在高并发编程中经典的例子,比如缓存行填充(这些概念会在后面详细说明),从实现方法上来讲RingBuffer并没有使用什么高深的技术,但是由于其巧妙的设计加上无锁并发的思想于是乎就成为一款非常优秀的并发框架,这也是其获得获得2011 Duke’s 程序框架创新奖的原因。关于RingBuffer大家可以详细阅读并发编程网整理的官方文档中文版,不过需要注意的是并发编程网翻译的版本是基于早期版本,所以大家明白其原理即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Disruptor