copyonwritearraylist的sublist不触发fail-fast机制,因其无modcount校验,读操作基于创建时数组快照,写操作被禁止或委托原列表,故不会抛concurrentmodificationexception。

CopyOnWriteArrayList 本身不触发 fail-fast 机制,即使调用 subList 后对原列表执行写操作,也不会抛出 ConcurrentModificationException。
CopyOnWriteArrayList 的 subList 不支持结构性修改
调用 subList 返回的是一个内部子列表视图(基于当前数组快照),但它不是独立的 CopyOnWriteArrayList 实例,而是继承自 AbstractList 的子类。该子列表:
- 底层仍指向原 CopyOnWriteArrayList 的数组引用(创建时的快照)
- 所有写操作(如 add、remove、set)均直接委托给原列表执行
- 但其自身不维护 modCount 或 expectedModCount,因此不存在 fail-fast 检查逻辑
写操作发生在原列表,但 subList 迭代不受影响
当你对原列表调用 add() 或 remove():
- CopyOnWriteArrayList 触发写时复制:生成新数组、更新引用
-
已存在的 subList 对象仍持有旧数组的引用,其
get()、iterator()等读操作继续基于快照运行 - 若尝试通过 subList 调用
add()等方法,会抛出UnsupportedOperationException(因为它的实现直接 throw new UnsupportedOperationException())
与 ArrayList.subList 的关键区别
普通 ArrayList.subList 返回的子列表与原列表共享底层数组,并严格同步 modCount;一旦原列表被修改,子列表的任何操作(包括 get())都可能立即触发 ConcurrentModificationException。
而 CopyOnWriteArrayList.subList:
- 没有 modCount 校验机制
- 不抛
ConcurrentModificationException - 读操作安全但非实时(看到的是创建 subList 时刻的快照)
- 写操作被禁止或转发,不引发 fail-fast
本质上,CopyOnWriteArrayList 放弃了 fail-fast 设计哲学,用弱一致性换来了无锁读和线程安全——subList 只是这一设计的自然延伸,不是例外。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











