gpt4 book ai didi

java - 迭代 ConcurrentHashMap 后使用 get()

转载 作者:行者123 更新时间:2023-11-30 03:44:59 24 4
gpt4 key购买 nike

我有一个这样的代码片段:

    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);
}
}

我的问题是:是否有必要使用如图所示的同步块(synchronized block),因为从 keySet() 到 get() 的操作不是原子的(因此映射可以在一次调用和下一次调用之间更新,如ConcurrentHashMap 仅对于每个单独的调用都是线程安全的)?

我应该迭代 EntrySet 以确保构造完整的迭代器吗?

我相信如果调用 keySet() 和 get() 则需要同步块(synchronized block),但我对此不确定。

提前感谢您的回复。

最佳答案

这取决于您需要的结果。

目前,如果infoMap在另一个线程中修改很可能是 info成为nullget被调用 - 这会导致 NPE调用getName 。如果这是所需的行为,或者您确信此方法是 Map 的唯一位置将被修改然后只是 synchronized就足够了。

使用EntrySet不会回避问题——只会推迟它。所有要做的事情都是确保如果在迭代期间删除条目,您不会立即遇到问题 - 但显然您可能会返回 map 中不再存在的数据。

关于java - 迭代 ConcurrentHashMap 后使用 get(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25977238/

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