迭代器如何在并发哈希映射中进行故障保护

Gir*_*ish 8 java collections

当我知道在这个迭代CopyOnWriteArrayList线程安全的,由于快照引用的副本arrayList在迭代的时间被创建,并在所有这一切变化的操作(add, set, and so on)由制造实现底层数组的全新副本,这样他们就不会影响快照引用引用的副本和相同的副本CopyOnWriteArraySet,

但是如果遇到困难ConcurrentHashMap,那么请分享你的看法,如果迭代器是如何安全的话ConcurrentHaspMap

Old*_*eon 5

你的问题有点模棱两可——你failsafe在标题中提到,但thread-safe在正文中提到。我假设你的意思是线程安全的

来自GrepCode的示例源

...检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put和remove)重叠。检索反映了最近完成的更新操作在其开始时的结果。对于诸如 putAll 和clear 之类的聚合操作,并发检索可能仅反映某些条目的插入或删除。类似地,迭代器和枚举返回反映迭代器/枚举创建时或创建后某个时刻哈希表状态的元素。它们不会抛出 java.util.ConcurrentModificationException。

因此迭代是线程安全的,但他们将契约定义为迭代器和枚举返回反映迭代器/枚举创建时或创建后某个时刻的哈希表状态的元素。


Lou*_*man 0

来自文档:“类似地,迭代器和枚举返回反映迭代器/枚举创建时或创建后某个时刻哈希表状态的元素。”

生成的迭代器指向ConcurrentHashMap创建迭代器时的哈希表数组,因此它们不会考虑导致哈希表调整大小的更新,这是其规范所允许的。迭代哈希桶是安全的,因为哈希桶引用是volatile