类 SequenceBlocker

java.lang.Object
cn.wjybxx.disruptor.SequenceBlocker

public final class SequenceBlocker extends Object
序号阻塞器

在Disruptor的设计中,消费者只会条件等待生产者的序号发布,而不会条件等待前置消费者的序号发布,生产者也不会条件等待gating消费者的序号发布。 这有一定的缺陷,但我将沿用这个设定,有以下理由: 1. 生产者和消费者会构成复杂的回路,使用条件锁将极大增加wait/notify的复杂度,死锁风险高。 2. 彼此都使用条件锁通知,会产生大量的notify调用,这对吞吐量会造成影响。

原始设计的缺陷是什么? 1. 由于只支持消费者可条件等待生产者,其它情况下的依赖都是通过观察sequence的更新实现的。 2. 当使用Blocking策略时,如果当前消费者速度较快,而前置消费者速度很慢,那么消费者会消耗大量的CPU等待序号可用。 3. Disruptor不支持每一级消费者使用不同的等待策略,因此这个问题需要重写Blocking策略实现 -- 将等待前置消费者的部分修改为sleep模式。

作者:
wjybxx date - 2024/1/17
  • 构造器详细资料

    • SequenceBlocker

      public SequenceBlocker()
  • 方法详细资料

    • lock

      public void lock()
    • unlock

      public void unlock()
    • await

      public void await() throws InterruptedException
      抛出:
      InterruptedException
    • awaitNanos

      public long awaitNanos(long nanosTimeout) throws InterruptedException
      返回:
      剩余需要等待的时间
      抛出:
      InterruptedException
    • await

      public boolean await(long time, TimeUnit unit) throws InterruptedException
      抛出:
      InterruptedException
    • signalAll

      public void signalAll()
      唤醒等待中的线程。 注意: 1.该接口由该屏障的上游或第三方在停止时调用。 2.唤醒不意味着等待的序号已变为可用,在醒来后需要检查中断和终止信号。 3.由于消费者共用一个Blocker,因此还会受到其它消费者的牵连。