ConcurrentHashMap线程的values()安全吗?
Is values() of ConcurrentHashMap thread safe?
我是 Java8 的新手,正在处理多个线程 (~10) 将值写入并发哈希映射的问题。我有另一个专用线程,它读取 Concurrent Hash Map 中存在的所有值并 returns 它们(每 30 秒)。迭代 values() 方法的结果是否是在不获取并发修改异常的情况下获取结果的推荐方法?
注意:我完全可以接受过时的数据
我查看了官方文档,上面写着:
检索操作通常不会阻塞,因此可能与更新操作重叠。检索反映了最近完成的更新操作的结果。对于 putAll 和 clear 之类的聚合操作,并发检索可能仅反映某些条目的插入或删除。类似地,迭代器、拆分器和枚举 return 元素反映了散列 table 在创建 iterator/enumeration 时或创建后的某个时刻的状态。它们不会抛出 ConcurrentModificationException。
但是 values() 方法的文档说:
Returns 此映射中包含的值的集合视图
下面的代码线程安全吗?
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);
}
是的...有一些资格。
线程安全实际上意味着代码在多线程应用程序中根据其指定的行为工作。问题是你没有说清楚你期望代码实际做什么。
我们可以说的是:
- 迭代将根据先前声明的保证看到值。
- 内存模型保证意味着不应该有任何 讨厌的 行为与陈旧的值......除非你在将值对象放入映射后改变它们。 (如果你这样做,那么对象的方法需要被实现来解决这个问题;例如,它们可能需要
synchronized
。这对 String
值没有实际意义,因为它们是不可变的。)
我是 Java8 的新手,正在处理多个线程 (~10) 将值写入并发哈希映射的问题。我有另一个专用线程,它读取 Concurrent Hash Map 中存在的所有值并 returns 它们(每 30 秒)。迭代 values() 方法的结果是否是在不获取并发修改异常的情况下获取结果的推荐方法?
注意:我完全可以接受过时的数据
我查看了官方文档,上面写着:
检索操作通常不会阻塞,因此可能与更新操作重叠。检索反映了最近完成的更新操作的结果。对于 putAll 和 clear 之类的聚合操作,并发检索可能仅反映某些条目的插入或删除。类似地,迭代器、拆分器和枚举 return 元素反映了散列 table 在创建 iterator/enumeration 时或创建后的某个时刻的状态。它们不会抛出 ConcurrentModificationException。
但是 values() 方法的文档说:
Returns 此映射中包含的值的集合视图
下面的代码线程安全吗?
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 aConcurrentModificationException
?
是的。这是推荐的方式,你不会得到 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); }
是的...有一些资格。
线程安全实际上意味着代码在多线程应用程序中根据其指定的行为工作。问题是你没有说清楚你期望代码实际做什么。
我们可以说的是:
- 迭代将根据先前声明的保证看到值。
- 内存模型保证意味着不应该有任何 讨厌的 行为与陈旧的值......除非你在将值对象放入映射后改变它们。 (如果你这样做,那么对象的方法需要被实现来解决这个问题;例如,它们可能需要
synchronized
。这对String
值没有实际意义,因为它们是不可变的。)