并发编程框架Disruptor实战 - WaitStrategy
2018-11-05 本文已影响9人
紫霞等了至尊宝五百年
![](https://img.haomeiwen.com/i4685968/816881cc7a1f4165.png)
生产者和消费者都可能出现速度过快,追上对方的情况,这个时候就需要等待了.等待过程中也会有不同的策略.
1 主要策略
当消费者等待在SequenceBarrier
上时,有许多可选的等待策略,不同的等待策略在延迟和CPU资源的占用上有所不同,可以视应用场景选择:
![](https://img.haomeiwen.com/i4685968/0ea792ee47ada63f.png)
1.1 BlockingWaitStrategy
![](https://img.haomeiwen.com/i4685968/955529b90d374ba8.png)
![](https://img.haomeiwen.com/i4685968/73c3652b1fbbd56e.png)
![](https://img.haomeiwen.com/i4685968/9fb13fc7dfc97860.png)
生产者的默认策略是BlockingWaitStrategy,是在RingBuffer中确定的.但是生产者的默认实现MultiProducerSequencer没有使用等待策略
- 生产者是通过
LockSupport.parkNanos(1);
来等待的
MultiProducerSequencer#next(int n)
消费者的默认策略是
BatchEventProcessor的run方法
BatchEventProcessor#processEvents()
由SequenceBarrier
决定
![](https://img.haomeiwen.com/i4685968/a83e7ffdbe607e33.png)
Disruptor类中
![](https://img.haomeiwen.com/i4685968/f33d534562231134.png)
SequenceBarrier
是由ringBuffer决定的![](https://img.haomeiwen.com/i4685968/0d5c28375672864d.png)
看一看到最后是由
sequencer
来决定的![](https://img.haomeiwen.com/i4685968/d0e538326202f275.png)
![](https://img.haomeiwen.com/i4685968/f1c4bf50cdcc556f.png)
这里的
waitStrategy
就是sequencer
的waitStrategy
默认
MultiProducerSequencer
![](https://img.haomeiwen.com/i4685968/92130a575d5e383f.png)
MultiProducerSequencer的默认策略是BlockingWaitStrategy.
sequencer其实就是生产者,所以其实消费者的默认策略和生产者是一样的.
这个策略的内部适用一个锁和条件变量来控制线程的执行和等待(Java基本的同步方法)
最慢的等待策略,但也是CPU使用率最低和最稳定的选项
![](https://img.haomeiwen.com/i4685968/431c58331c76acc5.png)
1.2 SleepingWaitStrategy
![](https://img.haomeiwen.com/i4685968/00d12a4bd685b86c.png)
在多次循环尝试不成功后,选择让出CPU,等待下次调度,多次调度后仍不成功,尝试前睡眠一个纳秒级别的时间再尝试
这种策略平衡了延迟和CPU资源占用,但延迟不均匀
1.3 无锁高性能 YieldingWaitStrategy
![](https://img.haomeiwen.com/i4685968/b0627c47d305491d.png)
在多次循环尝试不成功后,选择让出CPU,等待下次调。平衡了延迟和CPU资源占用,但延迟也比较均匀。