生產者和消費者都可能出現速度過快,追上對方的情況,這個時候就需要等待了.等待過程中也會有不同的策略.
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
就是sequencer
的waitStrategy
默認MultiProducerSequencer
MultiProducerSequencer的默認策略是BlockingWaitStrategy.
sequencer其實就是生產者,所以其實消費者的默認策略和生產者是一樣的.
這個策略的內部適用一個鎖和條件變量來控制線程的執行和等待(Java基本的同步方法)
最慢的等待策略,但也是CPU使用率最低和最穩定的選項
1.2 SleepingWaitStrategy
在多次循環嘗試不成功後,選擇讓出CPU,等待下次調度,多次調度後仍不成功,嘗試前睡眠一個納秒級別的時間再嘗試 這種策略平衡了延遲和CPU資源佔用,但延遲不均勻
1.3 無鎖高性能 YieldingWaitStrategy
在多次循環嘗試不成功後,選擇讓出CPU,等待下次調。平衡了延遲和CPU資源佔用,但延遲也比較均勻。