在《disruptor(一) 单一生产者和WorkPool消费者源码阅读》介绍了单一生产者
当多个生产者向RingBuffer中写入数据时,创建Disruptor时要修改对应的参数:
Disruptor disruptor = new Disruptor(eventFactory, BUFFER_SIZE, executor, ProducerType.MULTI, new YieldingWaitStrategy ());
ProducerType.MULTI 使用这个参数,单一生产者时,Sequencer接口的实现是SingleProducerSequencer;当是多个线程写入时,使用另一个实现MultiProducerSequencer
在写入获取RingBuffer的序列号的实现:
/** * @see Sequencer#next(int) */ @Override public long next(int n) { if (n < 1) { throw new IllegalArgumentException("n must be > 0"); } //生产者当前写入到的序列号 long current; //下一个序列号 long next; //while循环主要服务CAS算法,不成功就重来 do { //获取生产者最新的序列号 current = cursor.get(); //要获取的序列号 next = current + n; //wrapPoint是一个很关键的变量,这个变量决定生产者是否可以覆盖序列号nextSequence,wrapPoint是为什么是nextSequence - bufferSize;RingBuffer表现出来的是一个环形的数据结构,实际上是一个长度为bufferSize的数组, //nextSequence - bufferSize如果nextSequence小于bufferSize wrapPoint是负数,表示可以一直生产;如果nextSequence大于bufferSize wrapPoint是一个大于0的数,由于生产者和消费者的序列号差距不能超过bufferSize //(超过bufferSize会覆盖消费者未消费的数据),wrapPoint要小于等于多个消费者线程中消费的最小的序列号,即cachedGatingSequence的值,这就是下面if判断的根据 long wrapPoint = next - bufferSize; //cachedGatingSequence, gatingSequenceCache这两个变量记录着上一次获取消费者中最小的消费序列号 long cachedGatingSequence = gatingSequenceCache.get(); //生产者不能继续写入,否则会覆盖消费者未消费的数据 if (wrapPoint > cachedGatingSequence || cachedGatingSequence > current) { //获取最新的消费者最小的消费序号 long gatingSequence = Util.getMinimumSequence(gatingSequences, current); //依然不能满足写入条件(写入会覆盖为消费的数据) if (wrapPoint > gatingSequence) { //锁一会,结束本次循环,重来 LockSupport.parkNanos(1); // TODO, should we spin based on the wait strategy? continue; } //缓存一下消费者中最小的消费序列号 gatingSequenceCache.set(gatingSequence); } else if (cursor.compareAndSet(current, next)) //满足消费条件,有空余的空间让生产者写入,使用CAS算法,成功则跳出本次循环,不成功则重来 { break; } } while (true); return next; }
MultiProducerSequencer和SingleProducerSequencer next方法的区别就在于多了一个CAS算法,获取消费者最小序列号的while循环和放到外面和CAS的while循环合并
相关推荐
#### 二、剖析Disruptor高效的原因 ##### 1.1 锁的缺点 锁是一种常见的同步机制,用于确保在多线程环境中对共享资源的独占访问。然而,锁的存在也带来了一系列问题: - **性能开销**:获取锁和释放锁的操作都需要...
SpringBoot整合Disruptor并发编程框架是针对高并发场景下性能优化的一种技术实践。Disruptor是由LMAX公司开发的一款高性能、低延迟的并发工具,它通过消除线程间的锁竞争,大大提升了多线程环境下的处理速度。...
《Spring Boot Starter Disruptor深度解析》 在现代软件开发中,高性能和低延迟往往是系统设计的关键要素。Spring Boot作为Java领域最受欢迎的微服务框架,提供了丰富的启动器(starters)来简化开发工作。"spring-...
disruptor-3.4.4.jar 官方github下载 亲测可用,大家赶紧下载吧 后续再补充其他常用jar(但不好下载的)
- 创建Producer:选择适合的策略,如SingleProducerSequencer或MultiProducerSequencer。 - 设置Consumer:实现EventHandler接口,定义事件处理逻辑。 - 创建Disruptor实例:配置Ring Buffer、Sequencer、事件...
Disruptor3.x Disruptor使用方式 EventHandler[] eventHandlers=new DisruptorEventHandler[]{new DisruptorEventHandler()}; DisruptorPublisher dp=new DisruptorPublisher(1024, eventHandlers); dp.start(); ...
消费者通过Wait策略等待可消费的消息,例如使用 BusySpinWaitStrategy 或 MultiProducerSequencer。一旦消息被消费,对应的槽位会被标记为可用,供生产者再次使用。 3. **Disruptor的事件处理器链** 在Disruptor中...
《Disruptor技术详解——基于DisruptorDemo.zip实例解析》 Disruptor,由LMAX公司开发并开源,是一款高性能、低延迟的并发工具,主要用于优化多线程间的通信。它采用一种环形缓冲区(Ring Buffer)的设计,极大地...
Disruptor是由LMAX公司开发的一种高性能的并发编程框架,主要应用于金融交易系统。它通过优化数据共享方式,显著提高了多线程环境下的处理速度。在"Disruptor 多个消费者"的场景中,我们可以深入理解Disruptor如何...
《Disruptor 框架详解与应用实例》 Disruptor 是一款高性能的并发工具库,由英国的 LMAX 公司开发并开源。它主要用于优化多线程环境下的数据共享,尤其在金融交易系统中表现卓越。Disruptor 的核心设计是一个环形...
Disruptor是由LMAX公司开发的一种高性能的并发编程框架,主要应用于金融交易系统。它以其高效、低延迟的事件处理机制而闻名。在C++版本的Disruptor中,我们同样可以享受到这种高效的并发能力,尤其适用于需要大量...
Disruptor是一款高性能的并发工具库,由LMAX公司开发并开源,主要应用于高频率交易系统。它通过优化线程间通信的方式,极大地提升了多线程环境下的数据处理速度。Disruptor的设计理念是避免传统的锁机制,转而采用一...
Error: java.lang.NoSuchMethodError: com.lmax.disruptor.dsl.Disruptor.<init>(Lcom/lmax/disruptor/EventFactory;ILjava/util/concurrent/ThreadFactory;Lcom/lmax/disruptor/dsl/ProducerType;Lcom/lmax/...
赠送jar包:disruptor-3.3.0.jar; 赠送原API文档:disruptor-3.3.0-javadoc.jar; 赠送源代码:disruptor-3.3.0-sources.jar; 赠送Maven依赖信息文件:disruptor-3.3.0.pom; 包含翻译后的API文档:disruptor-...
Disruptor是一款高性能的并发框架,它通过使用Ring Buffer和基于事件的处理方式来消除锁竞争,提升系统性能。在使用Disruptor过程中,开发者可能会遇到`FatalExceptionHandler`的错误,这通常是由于处理流程中的异常...
disruptor-3.4.2.jar 工具jar包 及 disruptor-3.4.2-sources.jar, Disruptor它是一个开源的并发框架,并获得2011 Duke’s 程序框架创新奖,能够在无锁的情况下实现网络的Queue并发操作,是 log4j2 引用的 jar 包
赠送jar包:disruptor-3.3.0.jar; 赠送原API文档:disruptor-3.3.0-javadoc.jar; 赠送源代码:disruptor-3.3.0-sources.jar; 赠送Maven依赖信息文件:disruptor-3.3.0.pom; 包含翻译后的API文档:disruptor-...
Java工具:高性能并发工具Disruptor简单使用 在Java编程中,高效并发处理是优化系统性能的关键之一。Disruptor,由LMAX公司开源的一款并发框架,为处理高并发场景提供了一种新颖且高效的解决方案。它通过消除锁和...
Disruptor是一款高性能的Java并发框架,由LMAX公司开发并开源。它的设计目标是解决多线程环境下的数据同步问题,特别是在高并发场景下,能够显著提高系统的处理能力。Disruptor的核心设计理念是利用环形缓冲区(Ring...