当我知道在这个迭代CopyOnWriteArrayList是线程安全的,由于快照引用的副本arrayList在迭代的时间被创建,并在所有这一切变化的操作(add, set, and so on)由制造实现底层数组的全新副本,这样他们就不会影响快照引用引用的副本和相同的副本CopyOnWriteArraySet,
但是如果遇到困难ConcurrentHashMap,那么请分享你的看法,如果迭代器是如何安全的话ConcurrentHaspMap
你的问题有点模棱两可——你failsafe在标题中提到,但thread-safe在正文中提到。我假设你的意思是线程安全的。
来自GrepCode的示例源
...检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put和remove)重叠。检索反映了最近完成的更新操作在其开始时的结果。对于诸如 putAll 和clear 之类的聚合操作,并发检索可能仅反映某些条目的插入或删除。类似地,迭代器和枚举返回反映迭代器/枚举创建时或创建后某个时刻哈希表状态的元素。它们不会抛出 java.util.ConcurrentModificationException。
因此迭代是线程安全的,但他们将契约定义为迭代器和枚举返回反映迭代器/枚举创建时或创建后某个时刻的哈希表状态的元素。
来自文档:“类似地,迭代器和枚举返回反映迭代器/枚举创建时或创建后某个时刻哈希表状态的元素。”
生成的迭代器指向ConcurrentHashMap创建迭代器时的哈希表数组,因此它们不会考虑导致哈希表调整大小的更新,这是其规范所允许的。迭代哈希桶是安全的,因为哈希桶引用是volatile。