disruptor实现细节及源码分析
一、 背景介绍
Disruptor它是一个开源的并发框架,并获得2011 Duke’s 程序框架创新奖,能够在无锁的情况下实现网络的Queue并发操作。
说明:下文所有内容基于disruptor3.34版本。
二、 应用场景
在消费者--生产者模式中或发布订阅模式中使用。
具有以下特点:
1. 无锁的设计及CAS式的原子访问。
2. 预分配存储空间,避免垃圾回收带来的资源消耗。
三、 核心对象
RingBuffer:环形的一个数据结构,对象初始化时,会使用事件Event进行填充。Buffer的大小必须是2的幂次方,方便移位操作。
Event:无指定具体接口,用户自己实现,可以携带任何业务数据。
EventFactory:产生事件Event的工厂,由用户自己实现。
EventTranslator:事件发布的回调接口,由用户实现,负责将业务参数设置到事件中。
Sequencer:序列产生器,也是协调生产者和消费者及实现高并发的核心。有MultiProducerSequencer 和 SingleProducerSequencer两个实现类。
SequenceBarrier:拥有RingBuffer的发布事件Sequence引用和消费者依赖的Sequence引用。决定消费者消费可消费的Sequence。
EventHandler:事件的处理者,由用户自己实现。
EventProcessor:事件的处理器,单独在一个线程中运行。
WorkHandler:事件的处理者,由用户自己实现。
WorkProcessor:事件的处理器,单独在一个线程中运行。
WorkerPool:一组WorkProcessor的处理。
WaitStrategy:在消费者比生产者快时,消费者处理器的等待策略。
四、 简单示例
1. 定义业务数据类:
public class MyData {
private long value;
public MyData(long value){
this.value = value;
}
public long getValue() {
return value;
}
public void setValue(long value) {
this.value = value;
}
public String toString(){
StringBuffer sb = new StringBuffer();
sb.append("value=").append(value);
return sb.toString();
}
}
2. 定义事件类:
public class MyEvent {
private MyData data;
public MyData getData() {
return data;
}
public void setData(MyData data) {
this.data = data;
}
}
3. 定义事件处理类:
public class MyEventHandler implements EventHandler<MyEvent>{
@Override
public void onEvent(MyEvent event, long sequence, boolean endOfBatch)