CopyOnWriteArrayList
和ConcurrentHashMap
中的迭代器都是故障安全的,不会抛出CME。
IN CopyOnWriteArrayList<E>
迭代器是基于快照构建的
原始底层数组。所以这里的迭代器是故障安全,还有线程安全。
CopyOnWriteArrayList<E>
的Javadcos明确指出术语快照。
“快照”样式迭代器方法使用对状态的引用 创建迭代器时的数组。这个数组从不 在迭代器的生命周期中发生了变化,因此干扰就是 不可能,并且保证迭代器不会抛出 ConcurrentModificationException的。
如果ConcurrentHashMap
迭代器也建立在原始底层地图的快照上吗?
...谢谢
答案 0 :(得分:5)
不一定 - cf the javadoc (emphasis mine):
类似地,Iterators和Enumerations在迭代器/枚举创建时或之后的某个时刻返回反映哈希表状态的元素。
如果您查看values
,entrySet
和keySet
方法:
视图的迭代器[...]保证遍历构造迭代器时存在的元素,并且可以(但不保证)反映构造之后的任何修改。