ConcurrentHashMap 的 forEach 方法是否线程安全?



如果要迭代ConcurrentHashMap中的所有元素,使用forEach方法线程安全吗?

这取决于线程安全的含义。

  • 如果您同意其他线程能够在forEach调用过程中修改映射,那么是的,这是线程安全的
  • 如果您希望映射在forEach进行中时不可修改,以便其他线程在尝试修改时被阻止或出错,那么不,也不是

API文档说明:

然而,即使所有操作都是线程安全的,检索操作也不需要锁定,并且不支持以阻止所有访问的方式锁定整个表。

类似地,Iterators、Spliterators和Enumerations返回的元素反映了在创建迭代器/枚举时或之后某个时刻的哈希表状态。他们不扔ConcurrentModificationException。。。。请记住,聚合状态方法的结果。。。通常只有当映射没有在其他线程中进行并发更新时才有用。否则,这些方法的结果反映的瞬态可能足以用于监测或估计目的,但不足以用于程序控制。