当前位置: 首页 > 面试题库 >

迭代ConcurrentHashMap值线程安全吗?

束阳旭
2023-03-14
问题内容

在javadoc中,ConcurrentHashMap如下:

检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put和remove)重叠。检索反映了自启动以来最新完成的更新操作的结果。对于诸如putAll和clear的聚合操作,并发检索可能仅反映某些条目的插入或删除。同样,迭代器和枚举返回的元素反映了在创建迭代器/枚举时或此后某个时刻哈希表的状态。他们不抛出ConcurrentModificationException。但是,迭代器被设计为一次只能由一个线程使用。

这是什么意思?如果我尝试同时使用两个线程迭代地图,会发生什么情况?如果在迭代过程中从地图上放置或删除值,会发生什么情况?


问题答案:

这是什么意思?

这意味着你从中获得的每个迭代器ConcurrentHashMap都旨在由单个线程使用,并且不应被传递。这包括for-each循环提供的语法糖。

如果我尝试同时使用两个线程迭代地图,会发生什么情况?

如果每个线程都使用自己的迭代器,它将按预期工作。

如果在迭代过程中从地图上放置或删除值,会发生什么情况?

保证这样做不会使事情中断(这是“并发” ConcurrentHashMap含义的一部分)。但是,不能保证一个线程将看到另一线程执行的映射更改(无需从映射中获取新的迭代器)。保证迭代器在创建地图时能够反映其状态。进一步的更改可能会反映在迭代器中,但不一定如此。

总之,类似

for (Object o : someConcurrentHashMap.entrySet()) {
// …
}
几乎每次看到它都会好(或至少很安全)。




 类似资料:
  • 我只是想探讨一下ThreadSafe是什么意思? 以下是我的理解: 对我来说,它看起来像;允许多个线程同时访问一个集合;这与它的同步无关。例如,任何没有同步关键字的方法;是线程安全的,意味着多个线程可以访问它。 由开发人员选择在此方法上维护更多逻辑(同步),以便在多线程访问数据时保持数据完整性。这与线程安全是分开的。 如果我的上述陈述是错误的;只需阅读下面的 JAVA DOC for 'Concu

  • HashMap的底层算法采用了链地址法来解决哈希冲突 哈希表 在数据结构中有一种称为哈希表的数据结构,它实际上是数组的推广。如果有一个数组,要最有效的查找某个元素的位置,如果存储空间足够大,那么可以对每个元素和内存中的某个地址对应起来,然后把每个元素的地址用一个数组(这个数组也称为哈希表)存储起来,然后通过数组下标就可以直接找到某个元素了。这种方法术语叫做直接寻址法。这种方法的关键是要把每个元素和

  • 假设我有std::vector和两个线程。 第一个线程正在处理擦除函数,而第二个线程在for循环中 这种情况是线程安全的吗? 第二个线程会继续运行还是抛出异常?

  • 问题内容: 我正在制作一个需要一堆日记条目并计算总和的应用程序。 下面的方法是在有 多个线程 调用该方法时是线程/并发安全的。我想确保每个电话都能正确更新总数。 如果不安全,请说明为确保线程安全我该怎么做。 我需要获取/放置还是有更好的方法? 非常感谢! 更新: 谢谢大家的回答,我已经知道上面的代码 不是线程安全的 。 感谢Vint建议使用替代。我以前用来保存整数和,我想知道BigDecimal是

  • 我试图理解如果下面是线程安全的,它是由另一个开发人员编写的代码,我已经继承和不再与我们在一起。 我有一个BaseProvider类,它实际上是一个消息缓存,由LinkedBlockingQueue表示。该类将传入的消息存储在队列中。 我有一组读此队列的辅助线程。因此,LinkedBlockingQueue是线程安全的。 正如您所注意到的,每个辅助线程都可以访问所有的提供者,所以当一个辅助线程遍历所

  • 问题内容: 自从我将哈希表用于任何重要的事情以来已经有一段时间了,但是我似乎想起了get()和put()方法是同步的。 JavaDocs没有反映这一点。他们只是说类Hashtable是同步的。我该怎么办?如果多个线程同时访问哈希表(假设它们没有修改同一条目),则操作将成功,对吗?我想我问的是“ java.util.Hashtable线程安全吗?” 请指导我摆脱这个问题… 问题答案: 它是线程安全的