[英]Ensure to get all values of `ConcurrentHashMap` when iterating over it while other threads put elements
[英]Using get() after iterating over ConcurrentHashMap
我有一个这样的代码片段:
private final Map<String, Information> infoMap = new ConcurrentHashMap<String, Information>();
synchronized (infoMap) {
for (final String nameAndVersion : infoMap.keySet()) {
final Information info = infoMap.get(nameAndVersion);
final String name = info.getName();
names.add(name);
}
}
我的问题是:是否需要使用如图所示的同步块,因为从keySet()到get()的操作不是原子的(因此,可以在一个调用与下一个调用之间更新映射,因为ConcurrentHashMap是每个调用仅具有线程安全性)?
我是否应该遍历EntrySet以确保构造完整的迭代器?
我相信如果调用keySet()和get(),则需要同步块,但是对此我不确定。
预先感谢您的回复。
这取决于您需要的结果。
当前,如果在另一个线程中修改了infoMap
,则在infoMap
get
时info
很可能为null
,这将导致对getName
的调用中出现NPE
。 如果这是必需的行为,或者您确信此方法是将要修改Map
的唯一位置,那么仅synchronized
就足够了。
使用EntrySet
不会EntrySet
问题-只会推迟它。 所有要做的就是确保,如果在迭代过程中删除某个条目,则不会立即出现问题-但是显然,您可能返回的映射图中不再存在的数据。
遍历HashMap的键和值时,应始终使用entrySet()方法。 此外,在ConcurrentHashMap中,entrySet()将永远不会抛出“ ConcurrentModificationException” (请参阅Javadoc)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.