生产者和消费者都可能出现速度过快,追上对方的情况,这个时候就需要等待了.等待过程中也会有不同的策略.
生产者的默认策略是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其实就是生产者,所以其实消费者的默认策略和生产者是一样的.