简介: disruptor实用于多个线程之间的音讯队列,作用与ArrayBlockingQueue有相似之处,然而disruptor从性能、性能都远好于ArrayBlockingQueue,当多个线程之间传递大量数据或对性能要求较高时,能够思考应用disruptor作为ArrayBlockingQueue的替代者。Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的提早问题。与Kafka、RabbitMQ用于服务间的音讯队列不同,disruptor个别用于线程间音讯的传递。基于Disruptor开发的零碎单线程能撑持每秒600万订单。disruptor实用于多个线程之间的音讯队列,作用与ArrayBlockingQueue有相似之处,然而disruptor从性能、性能都远好于ArrayBlockingQueue,当多个线程之间传递大量数据或对性能要求较高时,能够思考应用disruptor作为ArrayBlockingQueue的替代者。官网也对disruptor和ArrayBlockingQueue的性能在不同的利用场景下做了比照,目测性能只有有5~10倍左右的晋升。一、Disruptor的益处通过后面的介绍咱们晓得Disruptor作用与ArrayBlockingQueue相似,实用于多个线程之间的音讯队列。为什么呢?因为Java中的队列就以BlockingQueue为例子,从命名上就能看出是一个阻塞的队列。当多线程的环境下会进行加锁。所以导致了性能不高,而Disruptor的设计十分的奇妙,他造成了一个环形队列。通过打消锁,从而进步了性能。如何你还不理解Queue,请点这里✈️Log4j2 异步输入,在应用了Disruptor的晋升如下图。起源log4j2官网

二、为什么这么快这里波及到的知识点比拟多,如果想学性能优化的同学能够去看看。能够学习外面的设计思维和优化的方向。Disruptor详解伪共享概念三、如何应用 <dependency>

        <groupId>com.lmax</groupId>        <artifactId>disruptor</artifactId>        <version>3.4.2</version>    </dependency>3.1 定义Disruptor        //指定RingBuffer大小,    //必须是2的N次方    int bufferSize = 1024;    //构建Disruptor    Disruptor<LongEvent> disruptor            = new Disruptor<>(            LongEvent::new,            bufferSize,            DaemonThreadFactory.INSTANCE);3.2 定义事件处理器        //注册事件处理器    disruptor.handleEventsWith(            (event, sequence, endOfBatch) ->                    System.out.println("E: " + event));3.3 生产数据        //启动Disruptor    disruptor.start();    //获取RingBuffer    RingBuffer<LongEvent> ringBuffer            = disruptor.getRingBuffer();    //生产Event    ByteBuffer bb = ByteBuffer.allocate(8);    for (long l = 0; l < 10; l++) {        bb.putLong(0, l);        //生产者生产音讯        ringBuffer.publishEvent(                (event, sequence, buffer) ->                        event.setValue(buffer.getLong(0)), bb);    }原文链接:https://click.aliyun.com/m/1000354797/本文为阿里云原创内容,未经容许不得转载。