【问题标题】:Why is CopyOnWriteArrayList different than iterating over unmodifiableList?为什么 CopyOnWriteArrayList 与迭代 unmodifiableList 不同?
【发布时间】:2025-12-23 16:30:12
【问题描述】:

我无法理解为什么我们不能只通过迭代一个不可变列表而不是使用这个新实现来实现?

【问题讨论】:

  • 您是在询问迭代CopyOnWriteArrayList 和迭代调用Collections.unmodifiableList(..) 返回的List 之间的区别吗?
  • 主要区别在于它是可变的和线程安全的。不可变列表是...不可变的。 Java 没有任何内置的不可变类型 - 没有告诉我们您使用的是什么实现,我们只能这么说。
  • @SotiriosDelimanolis 不,我的问题与此 CopyOnWriteArrayList 的相关性有关。并且我们不能仅仅使用一个 ImmutableList 来获得相同的功能,它是 CopyOnWriteArrayList 的 USP(唯一卖点)。
  • @SotiriosDelimanolis USP 是独特的卖点。
  • 你在这里混合了很多概念; COW 列表的特点是线程安全的; Collections.unmodifiableList() 的特点是它禁用对该列表的修改。

标签: java java.util.concurrent copyonwritearraylist


【解决方案1】:

CopyOnWriteArrayList 状态的 javadoc

ArrayList 的线程安全变体,其中所有可变操作 (添加、设置等)是通过制作新的副本来实现的 底层数组。

Collections#unmodifiableList(List) 的 javadoc 状态

返回指定列表的不可修改视图。这种方法允许 模块为用户提供对内部列表的“只读”访问权限。

对返回列表“通读”到指定的查询操作 列表,并尝试修改返回的列表,无论是直接还是通过 它的迭代器,结果是UnsupportedOperationException

所以,不,您无法通过Collections#unmodifiableList(List) 返回的List 获得CopyOnWriteArrayList 提供的功能。

【讨论】:

    最近更新 更多