gpt4 book ai didi

java - ConcurrentHashMap的values()线程安全吗?

转载 作者:行者123 更新时间:2023-11-30 01:51:13 25 4
gpt4 key购买 nike

我是 Java8 新手,正在解决多个线程(~10)将值写入并发 HashMap 的问题。我有另一个专用线程,它读取并发 HashMap 中存在的所有值并返回它们(每 30 秒)。迭代 value() 方法的结果是否是获取结果而不会出现并发修改异常的推荐方法?

注意:我完全可以接受过时的数据

我查看了官方文档,其中写道:

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

然而,values() 方法的文档说:

返回此映射中包含的值的 Collection View

下面的代码线程安全吗?

for (String name: myMap.values()) {
System.out.println("name": + name);
}

最佳答案

Is iterating over result of values() method the recommended way of fetching results without getting a ConcurrentModificationException?

是的。这是推荐的方法,您不会收到 ConcurrentModificationException

正如包级别 javadoc 所述:

Most concurrent Collection implementations (including most Queues) also differ from the usual java.util conventions in that their Iterators and Spliterators provide weakly consistent rather than fast-fail traversal:

  • they may proceed concurrently with other operations
  • they will never throw ConcurrentModificationException
  • they are guaranteed to traverse elements as they existed upon construction exactly once, and may (but are not guaranteed to) reflect any modifications subsequent to construction.
<小时/>

Is the below code thread safe?

  for (String name: myMap.values()) {
System.out.println("name": + name);
}

是的......有一些资格。

线程安全实际上意味着代码在多线程应用程序中按照其指定的行为工作。问题是您没有清楚地说出您期望代码实际执行的操作

我们可以说的是:

  1. 迭代将看到按照之前规定的保证得到的值。
  2. 内存模型保证意味着过时的值不应该出现任何令人讨厌的行为......除非您在将值对象放入映射后对其进行变异。 (如果这样做,则需要实现该对象的方法来处理该问题;例如,它们可能需要同步。这对于String值来说是没有意义的,因为它们是不可变的。)

关于java - ConcurrentHashMap的values()线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55983166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com