java.lang.Object
cn.wjybxx.disruptor.RingBufferSequencer
- 所有已实现的接口:
ProducerBarrier,SequenceBarrier,Sequencer
基于
RingBuffer的序列生成器。- 作者:
- wjybxx date - 2024/1/16
-
字段概要
字段修饰符和类型字段说明protected final SequenceBlocker序号阻塞器 -- 用于唤醒等待生产者发布数据的消费者protected final intringBuffer有效数据缓冲区大小protected final Sequence生产者的序列,表示生产者的进度。protected SequenceBarrier[]网关屏障,序号生成器必须和这些屏障满足以下约束: cursor-bufferSize 无效输入:'<'= Min(gatingSequence) 即:所有的gatingBarrier让出下一个插槽后,生产者才能获取该插槽。protected final long等待序号时的睡眠时间 -- 如果为0则使用自旋等待从接口继承的字段 cn.wjybxx.disruptor.SequenceBarrier
INITIAL_SEQUENCE -
构造器概要
构造器构造器说明RingBufferSequencer(int bufferSize, long sleepNanos, WaitStrategy waitStrategy, SequenceBlocker blocker) -
方法概要
修饰符和类型方法说明voidaddDependentBarriers(SequenceBarrier... barriersToTrack) 添加当前屏障需要追踪的屏障。voidclaim(long sequence) 已过时。final long获取当前屏障【依赖的生产者或消费者】的序号。final SequenceBlocker获取用于阻塞等待序号的阻塞器。intThe capacity of the data structure to hold entries.final ProducerBarrier获取生产者屏障 --用于生产者申请和发布数据。final WaitStrategy默认等待策略final Sequence获取生产者组/消费者组用的Sequence。final longabstract long当前剩余容量。booleanremoveDependentBarrier(SequenceBarrier barrier) 移除这些屏障,不再跟踪它们的进度信息; 特殊用法:如果移除了所有的消费者,那么生产者便不会被阻塞,也就能ProducerBarrier.next()死循环中醒来!longsequence()当前Barrier关联的【生产或消费】进度。final void唤醒所有因条件等待阻塞的线程ProducerBarrier.getBlocker()的快捷方法long在给定时间内尝试申请序号 注意:受限于等待策略的扩展限制,该接口本质是ProducerBarrier.tryNext(int)的循环快捷方法。从类继承的方法 java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait从接口继承的方法 cn.wjybxx.disruptor.ProducerBarrier
getHighestPublishedSequence, hasAvailableCapacity, isPublished, next, next, nextInterruptibly, nextInterruptibly, publish, publish, tryNext, tryNext从接口继承的方法 cn.wjybxx.disruptor.Sequencer
addGatingBarriers, newMultiConsumerBarrier, newMultiConsumerBarrier, newSingleConsumerBarrier, newSingleConsumerBarrier, removeGatingBarrier
-
字段详细资料
-
cursor
生产者的序列,表示生产者的进度。 -
gatingBarriers
网关屏障,序号生成器必须和这些屏障满足以下约束: cursor-bufferSize 无效输入:'<'= Min(gatingSequence) 即:所有的gatingBarrier让出下一个插槽后,生产者才能获取该插槽。对于生产者来讲,它只需要关注消费链最末端的消费者的进度(因为它们的进度是最慢的)。 即:gatingBarrier就是所有消费链末端的消费们所拥有的的Sequence。
-
bufferSize
protected final int bufferSizeringBuffer有效数据缓冲区大小 -
sleepNanos
protected final long sleepNanos等待序号时的睡眠时间 -- 如果为0则使用自旋等待 -
blocker
序号阻塞器 -- 用于唤醒等待生产者发布数据的消费者
-
-
构造器详细资料
-
RingBufferSequencer
public RingBufferSequencer(int bufferSize, long sleepNanos, WaitStrategy waitStrategy, @Nullable SequenceBlocker 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
已过时。从接口复制的说明:SequenceBarrier设置当前屏障的序号。 1. 仅在初始化屏障时使用。 2. 这是个很危险的方法,避免在运行中使用,否则可能导致错误。 3. 屏障的初始值为SequenceBarrier.INITIAL_SEQUENCE。- 指定者:
claim在接口中SequenceBarrier- 参数:
sequence- 要初始化的值
-
getProducerBarrier
从接口复制的说明:Sequencer获取生产者屏障 --用于生产者申请和发布数据。- 指定者:
getProducerBarrier在接口中Sequencer
-
getBlocker
从接口复制的说明:Sequencer获取用于阻塞等待序号的阻塞器。 1.可能为null,如果整个系统禁用了基于锁的条件等待。 2.用于创建消费者屏障。- 指定者:
getBlocker在接口中ProducerBarrier- 指定者:
getBlocker在接口中Sequencer
-
getWaitStrategy
从接口复制的说明:Sequencer默认等待策略- 指定者:
getWaitStrategy在接口中Sequencer
-
signalAllWhenBlocking
public final void signalAllWhenBlocking()从接口复制的说明:ProducerBarrier唤醒所有因条件等待阻塞的线程ProducerBarrier.getBlocker()的快捷方法- 指定者:
signalAllWhenBlocking在接口中ProducerBarrier
-
tryNext
从接口复制的说明:ProducerBarrier在给定时间内尝试申请序号 注意:受限于等待策略的扩展限制,该接口本质是ProducerBarrier.tryNext(int)的循环快捷方法。- 指定者:
tryNext在接口中ProducerBarrier- 参数:
n- 需要申请的序号数量- 返回:
- 申请成功则返回对应的序号,否则返回 -1
-
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
从接口复制的说明:SequenceBarrier添加当前屏障需要追踪的屏障。 当前屏障关联的生产者或消费者会持续最终他们的进度,以保证数据生产或消费的正确性。ps:生产者的要追踪屏障通常是动态的,消费者要追踪的屏障通常在构造时指定。
- 指定者:
addDependentBarriers在接口中SequenceBarrier- 参数:
barriersToTrack- 要追踪的屏障
-
removeDependentBarrier
从接口复制的说明:SequenceBarrier移除这些屏障,不再跟踪它们的进度信息; 特殊用法:如果移除了所有的消费者,那么生产者便不会被阻塞,也就能ProducerBarrier.next()死循环中醒来!- 指定者:
removeDependentBarrier在接口中SequenceBarrier- 参数:
barrier- 要删除的屏障- 返回:
- 如果给定barrier存在且删除成功则返回true,否则返回false。
-