[size=medium]disruptor生产者和消费者默认的等待策略
生产者和消费者都可能出现速度过快,追上对方的情况,这个时候就需要等待了.等待过程中也会有不同的策略.
生产者的默认策略是BlockingWaitStrategy,是在RingBuffer中确定的.但是生产者的默认实现MultiProducerSequencer没有使用等待策略.[/size]
[size=medium]生产者是通过 LockSupport.parkNanos(1); 来等待的.
消费者的默认策略是
BatchEventProcessor的run方法[/size]
[size=medium]可以看到是由SequenceBarrier来决定的
Disruptor类中
final SequenceBarrier barrier = ringBuffer.newBarrier(barrierSequences);
SequenceBarrier是由ringBuffer决定的
[/size]
[size=medium]看一看到最后是有sequencer来决定的
[/size]
[size=medium]这里的waitStrategy就是sequencer的waitStrategy.默认的sequencer是MultiProducerSequencer.[/size]
[size=medium]MultiProducerSequencer的默认策略是BlockingWaitStrategy.
sequencer其实就是生产者,所以其实消费者的默认策略和生产者是一样的.[/size]
生产者和消费者都可能出现速度过快,追上对方的情况,这个时候就需要等待了.等待过程中也会有不同的策略.
生产者的默认策略是BlockingWaitStrategy,是在RingBuffer中确定的.但是生产者的默认实现MultiProducerSequencer没有使用等待策略.[/size]
if (wrapPoint > gatingSequence)
{
LockSupport.parkNanos(1);
continue;
}
[size=medium]生产者是通过 LockSupport.parkNanos(1); 来等待的.
消费者的默认策略是
BatchEventProcessor的run方法[/size]
public void run()
{
final long availableSequence = sequenceBarrier.waitFor(nextSequence);
[size=medium]可以看到是由SequenceBarrier来决定的
Disruptor类中
final SequenceBarrier barrier = ringBuffer.newBarrier(barrierSequences);
SequenceBarrier是由ringBuffer决定的
[/size]
public SequenceBarrier newBarrier(Sequence... sequencesToTrack)
{
return sequencer.newBarrier(sequencesToTrack);
}
[size=medium]看一看到最后是有sequencer来决定的
[/size]
public SequenceBarrier newBarrier(Sequence... sequencesToTrack)
{
return new ProcessingSequenceBarrier(this, waitStrategy, cursor, sequencesToTrack);
}
[size=medium]这里的waitStrategy就是sequencer的waitStrategy.默认的sequencer是MultiProducerSequencer.[/size]
public static <E> RingBuffer<E> createMultiProducer(EventFactory<E> factory, int bufferSize)
{
return createMultiProducer(factory, bufferSize, new BlockingWaitStrategy());
}
[size=medium]MultiProducerSequencer的默认策略是BlockingWaitStrategy.
sequencer其实就是生产者,所以其实消费者的默认策略和生产者是一样的.[/size]