Disruptor 的 EventProcessor 消费过程不涉及 fail-fast 机制,因其不基于 Java 集合迭代器语义:它通过 SequenceBarrier 轮询 RingBuffer 序列号并直接数组下标访问预分配的固定长度 entries,无结构修改、无 modCount 机制,线程安全依赖原子序号协调而非集合结构保护。

Disruptor 的 EventProcessor 消费过程不涉及 fail-fast 机制,因为它根本不在 Java 集合框架的迭代器语义下运行。
Fail-fast 是 JDK 原生集合(如 ArrayList、HashMap)中迭代器的特性:当检测到集合在遍历过程中被结构修改(如 add/remove),就抛出 ConcurrentModificationException。这个机制依赖于 modCount 计数器与迭代器 expectedModCount 的比对,属于「有状态检查 + 异常中断」的协作模型。
而 Disruptor 的消费模型完全不同:
-
无集合遍历行为:EventProcessor 并不调用
iterator()或forEach()等方法遍历某个动态集合;它通过SequenceBarrier.waitFor()主动轮询 RingBuffer 中已发布但尚未被消费的事件序列范围,然后按序号直接索引访问RingBuffer.get(sequence)—— 这是数组下标访问,不是迭代器遍历。 -
无共享可变集合对象:RingBuffer 内部是预分配的固定长度
Object[] entries,元素位置由 long 序号计算(sequence & (size - 1)),整个生命周期内不增删元素、不 resize、不改变结构。modCount类机制既无意义也不存在。 -
线程安全靠序号协调,非锁或 CAS 保护集合结构:生产者和消费者各自维护自己的
Sequence(如cursor、claimStrategy、gatingSequences),所有交互基于原子 long 变量和内存屏障,而非对“集合结构”的并发修改控制。
所以,在 Disruptor 场景中:
- 不会出现
ConcurrentModificationException; - 不存在「遍历时被其他线程修改」的语义冲突;
- 即使多个 EventProcessor 并发读取同一事件(多播场景),也只是读同一内存地址,不触发任何结构校验;
- 若业务代码在
onEvent()回调里误操作了外部的ArrayList并并发遍历它——那抛出的ConcurrentModificationException属于那个外部集合,和 Disruptor 本身无关。
简单说:Disruptor 绕开了传统集合的抽象层,用 RingBuffer + Sequence + 预分配数组构建了一套更底层、更确定的数据流动契约。它不提供也不需要 fail-fast —— 它的设计目标是避免「需要检测并发修改」这一问题本身。
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











