前文了解了Disruptor与RingBuffer的基础知识后,接下来了解Disruptor对 ringbuffer的访问控制策略。
Disruptor对RingBuffer的读取策略
假设消费者(Consumer)是一个想从 Ring Buffer 里读取数据的线程,它可以访问 ConsumerBarrier对象——这个 对象由 RingBuffer 创建并且代表消费者与 RingBuffer 进行交互。就像 RingBuffer显然需要一个序号才能找到 下一个可用节点一样,消费者也需要知道它将要处理的序号——每个消费者都需要找到下一个它要访问的序 号。例如:消费者处理完了 RingBuffer 里序号8之前(包括 8)的所有数据,那么它期待访问的下一 个序号是 9。
消费者可以调用 ConsumerBarrier 对象的 waitFor() 方法,传递它所需要的下一个序号.
int nextSequence = 9;
final long availableSeq = consumerBarrier.waitFor(nextSequence);
//如果availableSeq为12,则表示节点 9,10,11 和 12 都已写入,消费者可以去处理
ConsumerBarrier 返回 RingBuffer 的最大可访问序号。ConsumerBarrier 有一个 WaitStrategy 方法来决定它如何等待这个序号(即waitFor方法无法返回时如何阻塞)。
WaitStrategy.Option.BLOCKING;
WaitStrategy.Option.YIELDING;
WaitStrategy.Option.BUSY_SPIN;
如上代码所示,当序号9还没有被生产者写入时,消费者会一直