`

Disruptor 源码分析(9) 不同等待策略之间的区别

 
阅读更多
disruptor 不同等待策略之间的区别

几个策略其实没有太多的区别,主要是--counter , Thread.yield(), LockSupport.parkNanos(1L),lock.lock(),超时抛异常其中的一种货多种的组合.

WaitStrategy有好几个实现类:

SleepingWaitStrategy 是这样的


while ((availableSequence = dependentSequence.get()) < sequence)
        {
            counter = applyWaitMethod(barrier, counter);
        }

 private int applyWaitMethod(final SequenceBarrier barrier, int counter)
        throws AlertException
    {
        barrier.checkAlert();

        if (counter > 100)
        {
            --counter;
        }
        else if (counter > 0)
        {
            --counter;
            Thread.yield();
        }
        else
        {
            LockSupport.parkNanos(1L);
        }


可以看到是--counter和Thread.yield()和LockSupport.parkNanos(1L)的混合.

PhasedBackoffWaitStrategy 是这样的:

 do
        {
            if ((availableSequence = dependentSequence.get()) >= sequence)
            {
                return availableSequence;
            }

            if (0 == --counter)
            {
                if (0 == startTime)
                {
                    startTime = System.nanoTime();
                }
                else
                {
                    long timeDelta = System.nanoTime() - startTime;
                    if (timeDelta > yieldTimeoutNanos)
                    {
                        return lockingStrategy.waitOnLock(sequence, cursor, dependentSequence, barrier);
                    }
                    else if (timeDelta > spinTimeoutNanos)
                    {
                        Thread.yield();
                    }
                }
                counter = SPIN_TRIES;
            }
        }
        while (true);

先是计算器不断-1.然后是Thread.yield();,然后是BlockingStrategy. BlockingStrategy会通过lock.lock();来实现.

BlockingWaitStrategy 是这样的:
就是ReentrantLock的lock和unlock 和等待publish的唤醒.

BusySpinWaitStrategy 是这样的:


 while ((availableSequence = dependentSequence.get()) < sequence)
        {
            barrier.checkAlert();
        }


可以看到是while一直不停的循环,对cpu的压力是很大的.



TimeoutBlockingWaitStrategy  是这样的:
 
lock.lock();
            try
            {
                while ((availableSequence = cursorSequence.get()) < sequence)
                {
                    barrier.checkAlert();
                    nanos = processorNotifyCondition.awaitNanos(nanos);
                    if (nanos <= 0)
                    {
                        throw TimeoutException.INSTANCE;
                    }

也是会加锁先.但是超过一定时间就是抛异常.


YieldingWaitStrategy是这样的:


while ((availableSequence = dependentSequence.get()) < sequence)
        {
            counter = applyWaitMethod(barrier, counter);
        }

 private int applyWaitMethod(final SequenceBarrier barrier, int counter)
        throws AlertException
    {
        if (0 == counter)
        {
            Thread.yield();
        }
        else
        {
            --counter;
        }

可以看到是--counter和Thread.yield()的混合.
分享到:
评论

相关推荐

    LMAX disruptor jar包+Demo+Api+src源码 disruptor-3.0.1.jar

    LMAX Disruptor是一款高性能的消息处理框架,由LMAX公司开发并开源,它在金融交易领域有着广泛的应用。Disruptor的设计目标是解决多线程环境下的数据共享问题,通过优化并发性能,实现极低的延迟和高吞吐量。在Java...

    disruptor-3.2.1源码带jar包20140321

    在"disruptor-3.2.1源码带jar包20140321"这个资源中,包含了Disruptor的源代码,这对于理解其内部机制和定制化开发非常有帮助。通过阅读源码,你可以更深入地了解如何利用Disruptor构建高效的并发系统。 此外,你还...

    disruptor-3.4.4.jar disruptor 3.4.4 jar 官方github下载

    disruptor-3.4.4.jar 官方github下载 亲测可用,大家赶紧下载吧 后续再补充其他常用jar(但不好下载的)

    disruptor 代码分析

    在Disruptor中,`YieldingWaitStrategy`是一种等待策略,它用于处理消费者在等待新事件时的行为。这种策略在消费者等待新事件时,会尝试放弃CPU时间片,以减少不必要的CPU占用。当没有事件可处理时,消费者会调用`...

    Disruptor demo

    4. **等待策略(Wait Strategies)**:Disruptor提供了多种等待策略,如 BusySpin、Block、Yield 等,用于控制消费者在没有新事件时的行为。例如,`BusySpin`策略会在无事件时忙循环,适合CPU资源充足的情况;而`...

    Disruptor并发框架中文参考文档

    ### Disruptor并发框架知识点详解 #### 一、Disruptor简介及原理 **Disruptor** 是一款高性能、低延迟的并发框架,它通过无锁设计实现了高效的队列操作,从而大大提升了多线程环境下的性能表现。该框架于2011年...

    Disruptor应用实例

    4. 处理器协作:Disruptor的等待策略(WaitStrategy)可以灵活调整,如使用忙等、多路复用或者阻塞等待,以适应不同的系统需求和资源条件。 5. 监控与优化:Disruptor提供了丰富的监控指标,如事件处理速率、延迟等...

    springboot整合Disruptor并发编程框架 #资源达人分享计划#

    6. 调优Disruptor的配置,如调整环形缓冲区大小、选择合适的序列化策略等,以适应不同并发场景的需求。 通过上述步骤,开发者可以有效地将Disruptor的优势引入到SpringBoot应用中,提升系统在高并发环境下的处理...

    Netty整合并发编程框架Disruptor实战百万长链接服务构建源码.zip

    Netty整合并发编程框架Disruptor实战百万长链接服务构建源码.zip Netty整合并发编程框架Disruptor实战百万长链接服务构建源码.zip Netty整合并发编程框架Disruptor实战百万长链接服务构建源码.zip

    disruptor jar包+Demo+Api

    Disruptor 还引入了 ClaimStrategy 和 WaitStrategy 两种策略,分别用于控制生产者的发布速度和消费者的等待策略,从而达到最佳的性能效果。 总的来说,这个压缩包提供了一个了解和学习 Disruptor 的良好起点,通过...

    SourceAnalysis_Disruptor:Disruptor原始码解析-源码解析

    Disruptor采用了多种优化策略,如批量处理、预读取和等待策略等。批量处理允许一次性处理多个事件,提高了效率;预读取则是在处理当前事件时,提前加载后续事件,减少了CPU的上下文切换;等待策略提供了多种选择,如...

    spring-boot-starter-disruptor.zip

    5. **序列化与事件转换**:启动器可能还包含对事件序列化和反序列化的支持,以便于跨线程或者跨进程的数据交换,以及事件类型的转换,简化了不同组件之间的通信。 通过深入理解和使用Spring Boot Starter Disruptor...

    disruptor 多个消费者

    5. **中断与唤醒机制**:Disruptor的消费者可以通过等待策略来处理空闲状态,如使用BlockWaitStrategy或BusySpinWaitStrategy。当没有新事件时,消费者会被阻塞或忙循环,直到有新的事件发布。 6. **Maven Webapp**...

    disruptor高性能Java线程间通讯库

    Disruptor提供了多种等待策略,如 BusySpinWaitStrategy、 SleepingWaitStrategy 和 YieldingWaitStrategy 等,可以根据实际应用场景选择合适的策略,以平衡等待时间和CPU利用率。 5. **批量操作与事件批处理**: ...

    DisruptorDemo.zip

    《Disruptor技术详解——基于DisruptorDemo.zip实例解析》 Disruptor,由LMAX公司开发并开源,是一款高性能、低延迟的并发工具,主要用于优化多线程间的通信。它采用一种环形缓冲区(Ring Buffer)的设计,极大地...

    Disruptor C++版(仅支持单生产者)

    7. 唤醒策略:Disruptor使用一种高效的唤醒机制,当消费者等待新事件时,生产者会唤醒它们,而不是让它们持续轮询,这样可以降低CPU使用率。 在使用Disruptor C++版时,你可以参考提供的示例代码来理解和实现自己的...

    无锁队列Disruptor超详细教程

    深入Disruptor源码分析 #### (1) 核心概念 - **Ring Buffer**:环形队列是Disruptor的基础数据结构,它使用固定大小的数组,避免了动态扩容带来的开销。 - **Sequence**:序列号,用于跟踪Ring Buffer中每个槽位的...

    Disruptor3.x Disruptor使用方式

    Disruptor3.x Disruptor使用方式 EventHandler[] eventHandlers=new DisruptorEventHandler[]{new DisruptorEventHandler()}; DisruptorPublisher dp=new DisruptorPublisher(1024, eventHandlers); dp.start(); ...

Global site tag (gtag.js) - Google Analytics