disruptor

参考 源码解析

并发编程网 翻译

这个玩意还是说生产者消费者的终结版,你用wait-notify-synchronized,然后你使用blockingqueue阻塞队列,他们都是基于锁的,高并发下面,使用无锁的CAS操作,性能要好,使用concurrentlinkedqueue,使用这种基于cas的队列,更进一步,disruptor框架。

1:数组,不是链表,固定的大小。没有什么GC等。2:缓存优化,缓冲行什么的。

disruptor的核心就是RingBuffer这个结构。

1:读取数据

disruptor_第1张图片
过程

非常简单了,ringbuffer生成suquencebarrier。

disruptor_第2张图片
取数据

从代码的角度:你要写代码,编程模型是简单的。屏蔽了读取的序列化获取的过程。其实不是读取的,是推送的!当有生产者写入的时候,customerbarrier会通知这些消费线程,有策略对象控制。

编码都是屏蔽这些过程的,编码实现很简单。

disruptor_第3张图片
简单。

这就可以了,然后就是生成和消费了。

生产的过程更加简单,只是从代码上面  RingBuffer.next()即可。但是,这个next()后面;

disruptor_第4张图片
简单生产
disruptor_第5张图片
nextInt()的过程

就是next(),是生产者这边维护所有消费者的结点,比如12,该写13了,发现3还有人占着呢?不能生产,在这里等待。获取序号的过程,就是这样,不是简单的next()搞定了。

还有提交阶段:

disruptor_第6张图片
提交

就是必须按照顺序,如果某个请求的 sequence 未被提交,将会堵塞后续的发布操作或者其它的 producer。多生产者的提交,是按照顺序在走的。

那Ringbuffer就可以完成这个生成和消费了,但是,disruptor还能干什么。


disruptor_第7张图片
多业务的

这种情形,用ringbuffer写就不好写了,用disruptor来控制。 相当于帮你封装好了,编码非常简单。

RingBuffer都帮你屏蔽掉了,看demo,RingBuffer都没有,直接生成消费,逻辑设置。

disruptor_第8张图片
实现

一句话:写数据的过程和读数据的过程,然后,disruptor干什么的。

参考的:

disruptor_第9张图片
写入
处理

你可能感兴趣的:(disruptor)