类 RingBufferSequencer

java.lang.Object
cn.wjybxx.disruptor.RingBufferSequencer
所有已实现的接口:
ProducerBarrier, SequenceBarrier, Sequencer
直接已知子类:
MultiProducerSequencer, SingleProducerSequencer

public abstract class RingBufferSequencer extends Object implements ProducerBarrier, Sequencer
基于RingBuffer的序列生成器。
作者:
wjybxx date - 2024/1/16
  • 字段详细资料

    • cursor

      protected final Sequence cursor
      生产者的序列,表示生产者的进度。
    • gatingBarriers

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

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

    • bufferSize

      protected final int bufferSize
      ringBuffer有效数据缓冲区大小
    • sleepNanos

      protected final long sleepNanos
      等待序号时的睡眠时间 -- 如果为0则使用自旋等待
    • blocker

      protected final SequenceBlocker blocker
      序号阻塞器 -- 用于唤醒等待生产者发布数据的消费者
  • 构造器详细资料

    • RingBufferSequencer

      public RingBufferSequencer(int bufferSize, long sleepNanos, WaitStrategy waitStrategy, @Nullable SequenceBlocker blocker)
      参数:
      bufferSize - RingBuffer大小
      sleepNanos - 单步等待时间 - 0则使用自旋
      waitStrategy - 默认等待策略
      blocker - 用于唤醒消费者的锁
  • 方法详细资料

    • getBufferSize

      public int getBufferSize()
      The capacity of the data structure to hold entries.
      返回:
      the size of the RingBuffer.
    • remainingCapacity

      public abstract long remainingCapacity()
      当前剩余容量。 并不一定具有价值,因为多线程模型下查询容器的当前大小,它反映的总是一个旧值。

      Get the remaining capacity for this sequencer.

      返回:
      The number of slots remaining.
    • claim

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

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

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

      @Nullable public final SequenceBlocker getBlocker()
      从接口复制的说明: ProducerBarrier
      获取用于阻塞等待序号的阻塞器。 注意:可能为null,如果整个系统禁用了基于锁的条件等待。
      指定者:
      getBlocker 在接口中 ProducerBarrier
    • signalAllWhenBlocking

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

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

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

      public final 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。