【发布时间】:2019-09-22 18:55:54
【问题描述】:
我是 Java8 的新手,正在解决多个线程 (~10) 正在将值写入并发哈希映射的问题。我有另一个专用线程,它读取并发哈希映射中存在的所有值并返回它们(每 30 秒)。迭代 values() 方法的结果是在不获取并发修改异常的情况下获取结果的推荐方法吗?
注意:我完全可以获取过时的数据
我查看了官方文档,上面写着:
检索操作一般不会阻塞,因此可能与更新操作重叠。检索反映了最近完成的更新操作在其开始时保持的结果。对于 putAll 和 clear 等聚合操作,并发检索可能仅反映插入或删除某些条目。类似地,迭代器、拆分器和枚举返回反映哈希表在创建迭代器/枚举时或之后的某个时间点的状态的元素。它们不会抛出 ConcurrentModificationException。
但是 values() 方法的文档说:
返回此映射中包含的值的集合视图
下面的代码线程安全吗?
for (String name: myMap.values()) {
System.out.println("name": + name);
}
【问题讨论】:
-
是的,它是线程安全的。
-
您刚刚引用了答案:“同样,迭代器、拆分器和枚举返回的元素反映了在迭代器/枚举创建时或之后的某个时刻哈希表的状态”我>。该声明涵盖
entrySet()、keySet()、keys()、values()和elements()。
标签: java concurrency concurrenthashmap