java多线程之并发框架Disruptor

什么是Disruptor

Disruptor是一个高性能的无锁线程间通讯框架,作者英国LMAX公司,其用于自己一种新型零售金融交易平台,它能够以很低的延迟产生大量交易,这个系统是建立在JVM平台上,其核心是一个业务逻辑处理器,它能够在一个线程里每秒处理6百万订单。业务逻辑处理器完全是运行在内存中,使用事件源驱动方式。业务逻辑处理器的核心是Disruptor。其最大的特点就是能够在无锁的情况下实现网络的Queue并发操作。

Disruptor的特性

上面提到了Disruptor是一个无锁的并发框架,那么在多线程情况下如何避免线程间竞争的呢?答案就是在需要确保操作是线程安全的地方Disruptor使用CAS(Compare And Swap/Set)操作,这是一个CPU级别的指令,工作方式类似于乐观锁,跟新值的时候如果想要改变的值不再是原来的值,操作失败(有其他操作已经改变了这个值),否则操作成功。
Disruptor在器数据结构上也非常特别使用了RingBuffer(环形缓冲区)来实现,是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。RingBuffer 通常采用数组实现,对 CPU 缓存友好,性能比链表好。
在这里插入图片描述
Disruptor的高性能还表现在其避免GC上,其利用环形缓冲区提前分配缓冲区元素类型对象,Ring Buffer会首先将整个缓冲区填满为Factory所产生的实例,新添加时只需要设置其中的值即可。

Disruptor入门例子

Disruptor是通过事件源通知方式进行消息通讯,使用Disruptor需要知道三个重要的角色:事件、生产者和消费者,生产者和消费者均可以一个或者多个。有这样一个例子:在一个停车场的入口,每一辆车辆进来需要做三步处理,处理完后下一辆车才能进来,这三步分别是车辆数据入库、车辆数据进入Kafka消息队列、最后发送短信通知车主。通过分析我们可以知道车辆停车动作是事件,三步操作是消费者,而车辆则由生产者产生。

package com.luke.study.disruptor.event;

/**
 * @Descrtption 事件(消息)
 * @Author luke
 * @Date 2019/8/29
 **/
public class InParkingDataEvent {
   

    private String carLicense;

    public String getCarLicense() {
   
        return carLicense;
    }

    public void setCarLicense(String carLicense) {
   
        this.carLicense = carLicense;
    }

}
package com.luke.study.disruptor.handler;

import com.lmax.disruptor.EventHandler;
import com.lmax.disruptor.WorkHandler;
import com.luke.study.disruptor.event.InParkingDataEvent;

/**
 * @Descrtption ParkingDataInDbHandler 车辆数据存入数据库处理器
 * @Author luke
 * @Date 2019/8/29
 **/
public class ParkingDataInDbHandler implements EventHandler<InParkingDataEvent>, WorkHandler<InParkingDataEvent> {
   

    @Override
    public void onEvent(InParkingDataEvent event) throws Exception {
   
        long threadId = Thread.currentThread().getId();
        String carLicense = event.getCarLicense();
        System.out.println(String.format("Thread Id %s save %s into db ....",threadId,carLicense));
    }

    @Override
    public void onEvent(InParkingDataEvent event, long sequence, boolean endOfBatch) throws Exception {
   
        this.onEvent(event);
    }

}

package com.luke.study.d
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值