如果要迭代ConcurrentHashMap中的所有元素,使用forEach
方法线程安全吗?
这取决于线程安全的含义。
- 如果您同意其他线程能够在
forEach
调用过程中修改映射,那么是的,这是线程安全的 - 如果您希望映射在
forEach
进行中时不可修改,以便其他线程在尝试修改时被阻止或出错,那么不,也不是
API文档说明:
然而,即使所有操作都是线程安全的,检索操作也不需要锁定,并且不支持以阻止所有访问的方式锁定整个表。
类似地,Iterators、Spliterators和Enumerations返回的元素反映了在创建迭代器/枚举时或之后某个时刻的哈希表状态。他们不扔
ConcurrentModificationException
。。。。请记住,聚合状态方法的结果。。。通常只有当映射没有在其他线程中进行并发更新时才有用。否则,这些方法的结果反映的瞬态可能足以用于监测或估计目的,但不足以用于程序控制。