2

两者中的迭代器 CopyOnWriteArrayListConcurrentHashMap 都是故障安全的,不会抛出 CME。

INCopyOnWriteArrayList<E>迭代器建立在原始底层数组的快照之上。所以这里的迭代器是故障安全的,也是线程安全的。

Javadcos 用于CopyOnWriteArrayList<E> 明确说明术语快照

“快照”风格的迭代器方法使用对创建迭代器时数组状态的引用。这个数组在迭代器的生命周期内永远不会改变,所以干扰是不可能的,并且迭代器保证不会抛出 ConcurrentModificationException。

ConcurrentHashMap迭代器是否也建立在原始底层地图的快照上?

谢谢...

4

1 回答 1

5

不一定 - cf javadoc(强调我的)

类似地,迭代器和枚举返回反映哈希表在迭代器/枚举创建时或之后的某个时间点的状态的元素。

如果您查看values,entrySetkeySet方法:

视图的迭代器 [...] 保证遍历构建迭代器时存在的元素,并且可能(但不保证)反映构建后的任何修改。

于 2012-10-09T12:32:56.010 回答