disruptor生产者和消费者默认的等待策略
生产者和消费者都可能出现速度过快,追上对方的情况,这个时候就需要等待了.等待过程中也会有不同的策略.
生产者的默认策略是BlockingWaitStrategy,是在RingBuffer中确定的.但是生产者的默认实现MultiProducerSequencer没有使用等待策略.
if (wrapPoint > gatingSequence)
{
LockSupport.parkNanos(1);
continue;
}
生产者是通过 LockSupport.parkNanos(1); 来等待的.
消费者的默认策略是
BatchEventProcessor的run方法
public void run()
{
final long availableSequence = sequenceBarrier.waitFor(nextSequence);
可以看到是由SequenceBarrier来决定的
Disruptor类中
final SequenceBarrier barrier = ringBuffer.newBarrier(barrierSequences);
SequenceBarrier是由ringBuffer决定的
public SequenceBarrier newBarrier(Sequence... sequencesToTrack)
{
return sequencer.newBarrier(sequencesToTrack);
}
看一看到最后是有sequencer来决定的
public SequenceBarrier newBarrier(Sequence... sequencesToTrack)
{
return new ProcessingSequenceBarrier(this, waitStrategy, cursor, sequencesToTrack);
}
这里的waitStrategy就是sequencer的waitStrategy.默认的sequencer是MultiProducerSequencer.
public static <E> RingBuffer<E> createMultiProducer(EventFactory<E> factory, int bufferSize)
{
return createMultiProducer(factory, bufferSize, new BlockingWaitStrategy());
}
MultiProducerSequencer的默认策略是BlockingWaitStrategy.
sequencer其实就是生产者,所以其实消费者的默认策略和生产者是一样的.
分享到:
相关推荐
与传统的队列不同,Disruptor的环形缓冲区允许多个生产者和消费者并发操作,避免了锁竞争,从而实现了更高的性能。 1. **多消费者机制**:在Disruptor中,可以注册多个消费者监听事件。每个消费者都有一个独立的...
首先,创建生产者和消费者,然后配置Disruptor实例,设置事件处理器链。运行示例,观察Disruptor如何在多线程环境中高效地处理事件。这不仅加深了你对Disruptor的理解,还能够帮助你在实际项目中更好地应用这个框架...
- **Sequencer**:负责为生产者和消费者分配唯一的序列号,确保数据的有序性和一致性。 - **Producers**:生产者将消息放入Ring Buffer,遵循特定的策略(如使用_claim_操作)来避免冲突。 - **Consumers**:消费...
7. 唤醒策略:Disruptor使用一种高效的唤醒机制,当消费者等待新事件时,生产者会唤醒它们,而不是让它们持续轮询,这样可以降低CPU使用率。 在使用Disruptor C++版时,你可以参考提供的示例代码来理解和实现自己的...
在Disruptor中,`YieldingWaitStrategy`是一种等待策略,它用于处理消费者在等待新事件时的行为。这种策略在消费者等待新事件时,会尝试放弃CPU时间片,以减少不必要的CPU占用。当没有事件可处理时,消费者会调用`...
Disruptor适用于多种并发场景,如单生产者多消费者并行、多生产者单消费者、多生产者多消费者竞争、多个消费者串行消费、菱形执行、链式并行执行、多组消费者相互隔离以及六边形执行顺序等。不同的场景需要结合...
然后配置Ring Buffer大小、等待策略等参数,设置生产者和消费者,最后启动EventProcessor链。 通过深入理解和合理运用Disruptor,开发者可以构建出高效、低延迟的并发系统。对于Java开发中的性能优化,Disruptor是...
Disruptor的另一个关键特性是序列号(Sequence),每个生产者和消费者都有独立的序列号,用于跟踪它们对环形缓冲区的操作。这种设计保证了数据处理的有序性,避免了线程间的竞态条件。 在Disruptor中,生产者将数据...
Disruptor 还引入了 ClaimStrategy 和 WaitStrategy 两种策略,分别用于控制生产者的发布速度和消费者的等待策略,从而达到最佳的性能效果。 总的来说,这个压缩包提供了一个了解和学习 Disruptor 的良好起点,通过...
Ring Buffer使用两个指针(头指针和尾指针)来追踪生产者和消费者的进度。生产者通过尾指针写入数据,消费者通过头指针读取数据。这种设计确保了高并发场景下的高效性。 ##### 2.2 如何从Ring Buffer读取 消费者...
4. **等待策略(Wait Strategies)**:Disruptor提供了多种等待策略,如 BusySpin、Block、Yield 等,用于控制消费者在没有新事件时的行为。例如,`BusySpin`策略会在无事件时忙循环,适合CPU资源充足的情况;而`...
Disruptor的工作原理基于环形缓冲区(Ring Buffer)的设计,它将生产者和消费者之间的数据传递过程转换为顺序写入和读取,避免了传统并发模型中的锁竞争和上下文切换,从而实现了极高的消息传递效率。在SpringBoot中...
序列号是Disruptor中的关键概念,每个生产者和消费者都有自己的独立序列号,用来跟踪它们在环形缓冲区中的位置。屏障(Barrier)则是协调生产者和消费者之间工作关系的关键,它包括生产者屏障和消费者屏障。生产者...
7. 信号量(Barrier):在生产者和消费者之间建立同步点,确保数据的正确传递。 在"DisruptorDemo.zip"的示例代码中,我们可以看到以下关键类和方法: 1. `DisruptorDemo`:主类,创建Disruptor实例并启动事件...
3. **多生产者与多消费者**:Disruptor支持多个生产者和消费者并发操作,通过序列号的同步机制,保证了数据的一致性。 4. **事件处理流水线**:通过预定义的事件处理器链,Disruptor能构建出高效的数据处理流水线,...
disruptor-3.4.4.jar 官方github下载 亲测可用,大家赶紧下载吧 后续再补充其他常用jar(但不好下载的)
Disruptor是由LMAX公司开发并开源的一款高性能的并发...通过分析和运行这些示例,你可以掌握如何创建环形缓冲区、配置事件处理器、以及如何设置和调整屏障和等待策略,从而在自己的项目中充分利用Disruptor的性能优势。
这种设计使得生产者和消费者可以并发运行,且无需锁机制,大大提高了并发性能。 Disruptor的关键在于其序列化机制——Sequence。每个生产者和消费者都有一个独立的Sequence,表示它们当前处理到的事件位置。通过...