前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >并发编程框架Disruptor实战 - WaitStrategy消费者等待策略

并发编程框架Disruptor实战 - WaitStrategy消费者等待策略

作者头像
JavaEdge
发布2018-12-06 09:52:04
2K0
发布2018-12-06 09:52:04
举报
文章被收录于专栏:JavaEdgeJavaEdge

生产者和消费者都可能出现速度过快,追上对方的情况,这个时候就需要等待了.等待过程中也会有不同的策略.

1 主要策略

当消费者等待在SequenceBarrier上时,有许多可选的等待策略,不同的等待策略在延迟和CPU资源的占用上有所不同,可以视应用场景选择:

1.1 BlockingWaitStrategy

生产者的默认策略是BlockingWaitStrategy,是在RingBuffer中确定的.但是生产者的默认实现MultiProducerSequencer没有使用等待策略

  • 生产者是通过LockSupport.parkNanos(1);来等待的

MultiProducerSequencer#next(int n) 消费者的默认策略是 BatchEventProcessor的run方法

BatchEventProcessor#processEvents()

SequenceBarrier决定

Disruptor类中

Disruptor#createEventProcessors

SequenceBarrier是由ringBuffer决定的

看一看到最后是由sequencer来决定的

这里的waitStrategy就是sequencerwaitStrategy 默认MultiProducerSequencer

MultiProducerSequencer的默认策略是BlockingWaitStrategy.

sequencer其实就是生产者,所以其实消费者的默认策略和生产者是一样的.

这个策略的内部适用一个锁和条件变量来控制线程的执行和等待(Java基本的同步方法)

最慢的等待策略,但也是CPU使用率最低和最稳定的选项

1.2 SleepingWaitStrategy

在多次循环尝试不成功后,选择让出CPU,等待下次调度,多次调度后仍不成功,尝试前睡眠一个纳秒级别的时间再尝试 这种策略平衡了延迟和CPU资源占用,但延迟不均匀

1.3 无锁高性能 YieldingWaitStrategy

在多次循环尝试不成功后,选择让出CPU,等待下次调。平衡了延迟和CPU资源占用,但延迟也比较均匀。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.11.05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 主要策略
    • 1.1 BlockingWaitStrategy
      • 1.2 SleepingWaitStrategy
        • 1.3 无锁高性能 YieldingWaitStrategy
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档