- 所有已实现的接口:
ProducerBarrier,SequenceBarrier,Sequencer
- 作者:
- wjybxx date - 2024/1/20
-
字段概要
字段修饰符和类型字段说明protected final Sequence生产者组的序号。protected SequenceBarrier[]网关屏障,序号生成器必须和这些屏障满足以下约束: cursor-bufferSize 无效输入:'<'= Min(gatingSequence) 即:所有的gatingBarrier让出下一个插槽后,生产者才能获取该插槽。从接口继承的字段 cn.wjybxx.disruptor.SequenceBarrier
INITIAL_SEQUENCE -
构造器概要
构造器构造器说明MpUnboundedBufferSequencer(MpUnboundedBuffer<T> buffer, WaitStrategy waitStrategy, SequenceBlocker blocker) -
方法概要
修饰符和类型方法说明voidaddDependentBarriers(SequenceBarrier... barriersToTrack) 添加当前屏障需要追踪的屏障。voidclaim(long sequence) 已过时。final long获取当前屏障【依赖的生产者或消费者】的序号。final SequenceBlocker获取用于阻塞等待序号的阻塞器。longgetHighestPublishedSequence(long lo, long hi) 消费者可能看见尚未发布的块的序号final ProducerBarrier获取生产者屏障 --用于生产者申请和发布数据。final WaitStrategy默认等待策略final Sequence获取生产者组/消费者组用的Sequence。booleanhasAvailableCapacity(int requiredCapacity) 是否有足够的空间 Has the buffer got capacity to allocate another sequence.booleanisPublished(long sequence) 指定序号的数据是否已发布。final longlongnext()获取下一个事件的序号,空间不足时会阻塞(等待)。longnext(int n) 获取接下来的n个事件的序号,空间不足时会阻塞(等待)。long在ProducerBarrier.next()基础上会响应中断请求longnextInterruptibly(int n) 在ProducerBarrier.next(int)基础上会响应中断请求voidpublish(long sequence) 发布指定序号的数据,表示sequence对应的数据可用 Publishes a sequence.voidpublish(long lo, long hi) 批量发布数据,表示 [lowest,highest]区间段整段数据可用。booleanremoveDependentBarrier(SequenceBarrier barrier) 移除这些屏障,不再跟踪它们的进度信息; 特殊用法:如果移除了所有的消费者,那么生产者便不会被阻塞,也就能ProducerBarrier.next()死循环中醒来!longsequence()当前Barrier关联的【生产或消费】进度。final void唤醒所有因条件等待阻塞的线程ProducerBarrier.getBlocker()的快捷方法longtryNext()尝试获取下一个事件的序列,空间不足时抛出异常。longtryNext(int n) 尝试获取接下来n个数据的最后一个数据索引位置。long在给定时间内尝试申请序号 注意:受限于等待策略的扩展限制,该接口本质是ProducerBarrier.tryNext(int)的循环快捷方法。从类继承的方法 java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait从接口继承的方法 cn.wjybxx.disruptor.Sequencer
addGatingBarriers, newMultiConsumerBarrier, newMultiConsumerBarrier, newSingleConsumerBarrier, newSingleConsumerBarrier, removeGatingBarrier
-
字段详细资料
-
cursor
生产者组的序号。 1. 生产者先根据sequence计算当前应该填充的chunk的索引(编号),也根据sequence计算落在该chunk的哪个槽位。 2. 这仍然是一个预更新值,因为是多生产者模型。 -
gatingBarriers
网关屏障,序号生成器必须和这些屏障满足以下约束: cursor-bufferSize 无效输入:'<'= Min(gatingSequence) 即:所有的gatingBarrier让出下一个插槽后,生产者才能获取该插槽。对于生产者来讲,它只需要关注消费链最末端的消费者的进度(因为它们的进度是最慢的)。 即:gatingBarrier就是所有消费链末端的消费们所拥有的的Sequence。(想一想食物链)
-
-
构造器详细资料
-
MpUnboundedBufferSequencer
public MpUnboundedBufferSequencer(MpUnboundedBuffer<T> buffer, WaitStrategy waitStrategy, @Nullable SequenceBlocker blocker)
-
-
方法详细资料
-
claim
已过时。从接口复制的说明: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]区间段整段数据可用。 一般情况下,hi是ProducerBarrier.next()等方法申请到的最大序号,但也可能不是,生产者可能分段发布数据,以避免阻塞消费者。Batch publish sequences. Called when all of the events have been filled.
- 指定者:
publish在接口中ProducerBarrier- 参数:
lo- first sequence number to publishhi- 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
从接口复制的说明:ProducerBarrier在ProducerBarrier.next()基础上会响应中断请求- 指定者:
nextInterruptibly在接口中ProducerBarrier- 抛出:
InterruptedException- 如果申请期间线程被中断
-
nextInterruptibly
从接口复制的说明: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
requiredCapacityslots 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
requiredCapacityslots available. Have a look atProducerBarrier.next()for a description on how to use this method.- 指定者:
tryNext在接口中ProducerBarrier- 参数:
n- 需要申请的序号数量- 返回:
- 申请成功则返回对应的序号,否则返回 -1
-
tryNext
从接口复制的说明:ProducerBarrier在给定时间内尝试申请序号 注意:受限于等待策略的扩展限制,该接口本质是ProducerBarrier.tryNext(int)的循环快捷方法。- 指定者:
tryNext在接口中ProducerBarrier- 参数:
n- 需要申请的序号数量- 返回:
- 申请成功则返回对应的序号,否则返回 -1
-
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
-
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。
-