6. Disruptor

1 Disruptor简介
  1. disruptor译为分裂者,表示像分裂一样快
  2. 是单机性能最快的消息队列,内部使用CAS作为锁,只能将队列存放于内存,无法放到硬盘内
2 Disruptor与其他Queue比较
  1. ConcurrentLinkedQueue:链表实现,遍历效率低
  2. JDK中没有ConcurrentArrayQueue,因为插入效率太低了
  3. Disruptor是数组实现的队列:无锁,高并发,使用环形Buffer(RingBuffer),直接覆盖(不用清除)旧的数据,降低GC频率
  4. 实现了基于事件的生产者消费者模式(观察者模式)
3 RingBuffer
  1. 环形队列
  2. RingBuffer的sequence,指向下一个可用的元素
  3. 采用数组实现,没有首尾指针
//假如长度为8,当添加到第12个元素的时候在哪个序号上呢?用12%8决定
//当Buffer被填满的时候到底是覆盖还是等待,由Producer决定
//RingBuffer长度一般设为2的n次幂,利于二进制计算,因为x%2的n次幂与x&(2的n次幂-1)结果相同
12%8 = 12 & (8 - 1)  pos = num & (size -1)
  1. RingBuffer中存放的是一个个Event
  2. 相当于一个生产者,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开发步骤
  1. 导入disruptor-3.4.2.jar
  2. LongEvent:定义一个事件
public class LongEvent {
   
    private long value;
    public void set(long value) {
   
        this.value = value;
    }
    @Override
    public String toString() {
   
        return "LongEvent{" + "value=" + value + "}";
    }
}
  1. LongEventFactory:定义产生事件的工厂
import com.lmax.disruptor.EventFactory;
//需要实现EventFactory接口
public class LongEventFactory implements EventFactory<LongEvent> {
   
    @Override
    public LongEvent newInstance() {
   
        return new LongEvent();
    }
}

  1. LongEventHandler:消费者,通过onEvent方法消费Event
import com.lmax.disruptor.EventHandler;
//需要实现EventHandler
public class LongEventHandler implements EventHandler<LongEvent> {
   
    public static long count = 0;

    //longEvent:事件处理器正处理的事件
    //sequence:当前处理的Event所对应的序号
    //endOfBatch:表示RingBuffer中,在该事件之后,是否还有事件,即true就表示无事件了,消费者可以退出了,false表示后面还有事件,需要继续消费
    @Override
    public void 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值