类 MpUnboundedBufferSequencer<T>

java.lang.Object
cn.wjybxx.disruptor.MpUnboundedBufferSequencer<T>
所有已实现的接口:
ProducerBarrier, SequenceBarrier, Sequencer

public class MpUnboundedBufferSequencer<T> extends Object implements Sequencer, ProducerBarrier
作者:
wjybxx date - 2024/1/20
  • 字段详细资料

    • cursor

      protected final Sequence cursor
      生产者组的序号。 1. 生产者先根据sequence计算当前应该填充的chunk的索引(编号),也根据sequence计算落在该chunk的哪个槽位。 2. 这仍然是一个预更新值,因为是多生产者模型。
    • gatingBarriers

      protected volatile SequenceBarrier[] gatingBarriers
      网关屏障,序号生成器必须和这些屏障满足以下约束: cursor-bufferSize 无效输入:'<'= Min(gatingSequence) 即:所有的gatingBarrier让出下一个插槽后,生产者才能获取该插槽。

      对于生产者来讲,它只需要关注消费链最末端的消费者的进度(因为它们的进度是最慢的)。 即:gatingBarrier就是所有消费链末端的消费们所拥有的的Sequence。(想一想食物链)

  • 构造器详细资料

  • 方法详细资料

    • claim

      @Deprecated public void claim(long sequence)
      已过时。
      从接口复制的说明: SequenceBarrier
      设置当前屏障的序号。 1. 仅在初始化屏障时使用。 2. 这是个很危险的方法,避免在运行中使用,否则可能导致错误。 3. 屏障的初始值为SequenceBarrier.INITIAL_SEQUENCE
      指定者:
      claim 在接口中 SequenceBarrier
      参数:
      sequence - 要初始化的值
    • publish

      public void publish(long sequence)
      从接口复制的说明: ProducerBarrier
      发布指定序号的数据,表示sequence对应的数据可用 Publishes a sequence. Call when the event has been filled.
      指定者:
      publish 在接口中 ProducerBarrier
      参数:
      sequence - the sequence to be published.
    • publish

      public void publish(long lo, long hi)
      从接口复制的说明: ProducerBarrier
      批量发布数据,表示 [lowest,highest]区间段整段数据可用。 一般情况下,hiProducerBarrier.next()等方法申请到的最大序号,但也可能不是,生产者可能分段发布数据,以避免阻塞消费者。

      Batch publish sequences. Called when all of the events have been filled.

      指定者:
      publish 在接口中 ProducerBarrier
      参数:
      lo - first sequence number to publish
      hi - last sequence number to publish
    • isPublished

      public boolean isPublished(long sequence)
      从接口复制的说明: ProducerBarrier
      指定序号的数据是否已发布。 注意: 1. 该测试只测试序号自身,不测试其前置序号。 2. 通常情况下你不应该使用它,唯一合理的情况是:清理RingBuffer的时候。

      Confirms if a sequence is published and the event is available for use; non-blocking.

      指定者:
      isPublished 在接口中 ProducerBarrier
      参数:
      sequence - of the buffer to check
      返回:
      true if the sequence is available for use, false if not
    • getHighestPublishedSequence

      public long getHighestPublishedSequence(long lo, long hi)
      消费者可能看见尚未发布的块的序号
      指定者:
      getHighestPublishedSequence 在接口中 ProducerBarrier
      参数:
      lo - The sequence to start scanning from.
      hi - The sequence to scan to.
      返回:
      The highest value that can be safely read, will be at least nextSequence - 1.
    • hasAvailableCapacity

      public boolean hasAvailableCapacity(int requiredCapacity)
      从接口复制的说明: ProducerBarrier
      是否有足够的空间 Has the buffer got capacity to allocate another sequence. This is a concurrent method so the response should only be taken as an indication of available capacity.
      指定者:
      hasAvailableCapacity 在接口中 ProducerBarrier
      参数:
      requiredCapacity - in the buffer
      返回:
      true if the buffer has the capacity to allocate the next sequence otherwise false.
    • next

      public long next()
      从接口复制的说明: ProducerBarrier
      获取下一个事件的序号,空间不足时会阻塞(等待)。 申请完空间之后,必须使用 ProducerBarrier.publish(long) 发布,否则会导致整个数据结构不可用。

      Claim the next event in sequence for publishing.

      指定者:
      next 在接口中 ProducerBarrier
      返回:
      the claimed sequence value
    • next

      public long next(int n)
      从接口复制的说明: ProducerBarrier
      获取接下来的n个事件的序号,空间不足时会阻塞(等待)。 申请完空间之后,必须使用 ProducerBarrier.publish(long, long) 发布,否则会导致整个数据结构不可用

      Claim the next n events in sequence for publishing. This is for batch event producing. Using batch producing requires a little care and some math.

       int n = 10;
       long hi = sequencer.next(n);
       long lo = hi - (n - 1);
       for (long sequence = lo; sequence <= hi; sequence++) {
           // Do work.
       }
       sequencer.publish(lo, hi);
       
      指定者:
      next 在接口中 ProducerBarrier
      参数:
      n - the number of sequences to claim
      返回:
      the highest claimed sequence value
    • nextInterruptibly

      public long nextInterruptibly() throws InterruptedException
      从接口复制的说明: ProducerBarrier
      ProducerBarrier.next()基础上会响应中断请求
      指定者:
      nextInterruptibly 在接口中 ProducerBarrier
      抛出:
      InterruptedException - 如果申请期间线程被中断
    • nextInterruptibly

      public long nextInterruptibly(int n) throws InterruptedException
      从接口复制的说明: ProducerBarrier
      ProducerBarrier.next(int)基础上会响应中断请求
      指定者:
      nextInterruptibly 在接口中 ProducerBarrier
      抛出:
      InterruptedException - 如果申请期间线程被中断
    • tryNext

      public long tryNext()
      从接口复制的说明: ProducerBarrier
      尝试获取下一个事件的序列,空间不足时抛出异常。 申请完空间之后,必须使用 ProducerBarrier.publish(long) 发布,否则会导致整个数据结构不可用。

      Attempt to claim the next event in sequence for publishing. Will return the number of the slot if there is at least requiredCapacity slots available.

      指定者:
      tryNext 在接口中 ProducerBarrier
      返回:
      申请成功则返回对应的序号,否则返回 -1
    • tryNext

      public long tryNext(int n)
      从接口复制的说明: ProducerBarrier
      尝试获取接下来n个数据的最后一个数据索引位置。不会阻塞,空间不足时抛出异常。 申请完空间之后,必须使用 ProducerBarrier.publish(long, long) 发布,否则会导致整个数据结构不可用 使用该方法可以避免死锁

      Attempt to claim the next n events in sequence for publishing. Will return the highest numbered slot if there is at least requiredCapacity slots available. Have a look at ProducerBarrier.next() for a description on how to use this method.

      指定者:
      tryNext 在接口中 ProducerBarrier
      参数:
      n - 需要申请的序号数量
      返回:
      申请成功则返回对应的序号,否则返回 -1
    • tryNext

      public long tryNext(int n, long timeout, TimeUnit unit)
      从接口复制的说明: ProducerBarrier
      在给定时间内尝试申请序号 注意:受限于等待策略的扩展限制,该接口本质是ProducerBarrier.tryNext(int)的循环快捷方法。
      指定者:
      tryNext 在接口中 ProducerBarrier
      参数:
      n - 需要申请的序号数量
      返回:
      申请成功则返回对应的序号,否则返回 -1
    • getProducerBarrier

      public final ProducerBarrier getProducerBarrier()
      从接口复制的说明: Sequencer
      获取生产者屏障 --用于生产者申请和发布数据。
      指定者:
      getProducerBarrier 在接口中 Sequencer
    • getBlocker

      @Nullable public final SequenceBlocker getBlocker()
      从接口复制的说明: Sequencer
      获取用于阻塞等待序号的阻塞器。 1.可能为null,如果整个系统禁用了基于锁的条件等待。 2.用于创建消费者屏障。
      指定者:
      getBlocker 在接口中 ProducerBarrier
      指定者:
      getBlocker 在接口中 Sequencer
    • getWaitStrategy

      @Nonnull public final WaitStrategy getWaitStrategy()
      从接口复制的说明: Sequencer
      默认等待策略
      指定者:
      getWaitStrategy 在接口中 Sequencer
    • signalAllWhenBlocking

      public final void signalAllWhenBlocking()
      从接口复制的说明: ProducerBarrier
      唤醒所有因条件等待阻塞的线程 ProducerBarrier.getBlocker()的快捷方法
      指定者:
      signalAllWhenBlocking 在接口中 ProducerBarrier
    • groupSequence

      public final Sequence groupSequence()
      从接口复制的说明: SequenceBarrier
      获取生产者组/消费者组用的Sequence。 1. 生产者/消费者通过更新该Sequence更新屏障的进度。 2. 如果当前屏障是一个视图对象,而不是真正用于工作的屏障,该方法应当抛出异常,而不是创建一个虚假的Sequence
      指定者:
      groupSequence 在接口中 SequenceBarrier
    • sequence

      public long sequence()
      从接口复制的说明: SequenceBarrier
      当前Barrier关联的【生产或消费】进度。 上游需要感知当前Barrier的消费进度 -- 计算它的SequenceBarrier.dependentSequence()
      指定者:
      sequence 在接口中 SequenceBarrier
      返回:
      进度
    • dependentSequence

      public final long dependentSequence()
      从接口复制的说明: SequenceBarrier
      获取当前屏障【依赖的生产者或消费者】的序号。

      生产者

      1.对生产者而言,这是下一个可写数据的序号。 2.可能没有消费者,因此生产者可能没有依赖。

      消费者

      1.对消费者而言:这是下一个可消费数据的序号。 2.消费者可依赖生产者和其它消费者,该序号为所有依赖的最小序号。 3.依赖其它消费者时,依赖的是其已消费的序号 -- 确保可见性。
      指定者:
      dependentSequence 在接口中 SequenceBarrier
      返回:
      所有依赖的最小序号;没有依赖的情况下返回Long.MAX_VALUE
    • minimumSequence

      public final long minimumSequence()
      从接口复制的说明: SequenceBarrier
      指定者:
      minimumSequence 在接口中 SequenceBarrier
    • addDependentBarriers

      public void addDependentBarriers(SequenceBarrier... barriersToTrack)
      从接口复制的说明: SequenceBarrier
      添加当前屏障需要追踪的屏障。 当前屏障关联的生产者或消费者会持续最终他们的进度,以保证数据生产或消费的正确性。

      ps:生产者的要追踪屏障通常是动态的,消费者要追踪的屏障通常在构造时指定。

      指定者:
      addDependentBarriers 在接口中 SequenceBarrier
      参数:
      barriersToTrack - 要追踪的屏障
    • removeDependentBarrier

      public boolean removeDependentBarrier(SequenceBarrier barrier)
      从接口复制的说明: SequenceBarrier
      移除这些屏障,不再跟踪它们的进度信息; 特殊用法:如果移除了所有的消费者,那么生产者便不会被阻塞,也就能ProducerBarrier.next() 死循环中醒来!
      指定者:
      removeDependentBarrier 在接口中 SequenceBarrier
      参数:
      barrier - 要删除的屏障
      返回:
      如果给定barrier存在且删除成功则返回true,否则返回false。