1 Disruptor简介
- disruptor译为分裂者,表示像分裂一样快
- 是单机性能最快的消息队列,内部使用CAS作为锁,只能将队列存放于内存,无法放到硬盘内
2 Disruptor与其他Queue比较
- ConcurrentLinkedQueue:链表实现,遍历效率低
- JDK中没有ConcurrentArrayQueue,因为插入效率太低了
- Disruptor是数组实现的队列:无锁,高并发,使用环形Buffer(RingBuffer),直接覆盖(不用清除)旧的数据,降低GC频率
- 实现了基于事件的生产者消费者模式(观察者模式)
3 RingBuffer
- 环形队列
- RingBuffer的sequence,指向下一个可用的元素
- 采用数组实现,没有首尾指针
12%8 = 12 & (8 - 1) pos = num & (size -1)
- RingBuffer中存放的是一个个Event
- 相当于一个生产者,publish方法用于生产
4 相关网站
主页:http://lmax-exchange.github.io/disruptor/
源码:https://github.com/LMAX-Exchange/disruptor
GettingStarted: https://github.com/LMAX-Exchange/disruptor/wiki/Getting-Started
api: http://lmax-exchange.github.io/disruptor/docs/index.html
maven: https://mvnrepository.com/artifact/com.lmax/disruptor
5 Disruptor开发步骤
- 导入disruptor-3.4.2.jar
- LongEvent:定义一个事件
public class LongEvent {
private long value;
public void set(long value) {
this.value = value;
}
@Override
public String toString() {
return "LongEvent{" + "value=" + value + "}";
}
}
- LongEventFactory:定义产生事件的工厂
import com.lmax.disruptor.EventFactory;
public class LongEventFactory implements EventFactory<LongEvent> {
@Override
public LongEvent newInstance() {
return new LongEvent();
}
}
- LongEventHandler:消费者,通过onEvent方法消费Event
import com.lmax.disruptor.EventHandler;
public class LongEventHandler implements EventHandler<LongEvent> {
public static long count = 0;
@Override
public void