你了解并发框架 Disruptor 吗?(上篇)

Disruptor介绍

1. 主页:

http://lmax-exchange.github.io/disruptor/

2. 源码:

https://github.com/LMAX-Exchange/disruptor

3. GettingStarted: 

https://github.com/LMAX-Exchange/disruptor/wiki/Getting-Started

4. api: 

http://lmax-exchange.github.io/disruptor/docs/index.html

5. maven: 

https://mvnrepository.com/artifact/com.lmax/disruptor

Disruptor特点

1. 对比ConcurrentLinkedQueue : 链表实现

2. JDK中没有ConcurrentArrayQueue

3. Disruptor是数组实现的

4. 无锁,高并发,使用环形Buffer,直接覆盖(不用清除)旧的数据,降低GC频率

5. 实现了基于事件的生产者消费者模式(观察者模式)

 

RingBuffer:环形队列

RingBuffer的序号,指向下一个可用的元素,采用数组实现,没有首尾指针。

对比ConcurrentLinkedQueue,用数组实现的速度更快。假如长度为8,当添加到第12个元素的时候在哪个序号上呢?用12%8决定,当Buffer被填满的时候到底是覆盖还是等待,由Producer决定,长度设为2的n次幂,利于二进制计算,例如:12%8 = 12 & (8 - 1) pos = num & (size -1)。

 

Disruptor开发步骤

1. 定义Event - 队列中需要处理的元素;

2. 定义Event工厂,用于填充队列。

这里牵扯到效率问题:disruptor初始化的时候,会调用Event工厂,对ringBuffer进行内存的提前分配,GC产频率会降低。

3. 定义EventHandler(消费者),处理容器中的元素

具体开发模式和策略,以及相关代码,我们在下篇继续分享,。

你可能感兴趣的:(Java,后端)