繁体   English   中英

遍历ConcurrentHashMap后使用get()

[英]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 getinfo很可能为null ,这将导致对getName的调用中出现NPE 如果这是必需的行为,或者您确信此方法是将要修改Map的唯一位置,那么仅synchronized就足够了。

使用EntrySet不会EntrySet问题-只会推迟它。 所有要做的就是确保,如果在迭代过程中删除某个条目,则不会立即出现问题-但是显然,您可能返回的映射图中不再存在的数据。

遍历HashMap的键和值时,应始终使用entrySet()方法。 此外,在ConcurrentHashMap中,entrySet()将永远不会抛出“ ConcurrentModificationException” (请参阅Javadoc)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM