【发布时间】:2020-11-30 16:13:14
【问题描述】:
在下面的代码中,allStates.addAll(states) 出现了 concurrentModificationException。我怎样才能避免这种情况?
public synchronized Set<String> getAllStates(String clientName, Map<String, Set<String>> allClientStates) {
Set<String> allStates = new ConcurrentSkipListSet<>();
final Set<String> keySet = allClientStates.keySet();
for(String key: keySet) {
Set<String> states = allClientStates.get(key);
if(states != null)
allStates.addAll(states);
}
return allStates;
}
这是堆栈跟踪的顶部
exception": "null\njava.util.ConcurrentModificationException\n\tat java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)\n\tat java.util.HashMap$KeyIterator.next(HashMap.java:1469)\n\tat java.util.AbstractCollection.addAll(AbstractCollection.java:343)\n\tat com.xxx.config.ClientDashboardConfig.getAllStates(ClientDashboardConfig.java:312)
【问题讨论】:
-
您似乎正在其他地方修改地图。另请注意,似乎根本没有使用密钥的理由:
allClientStates.valueSet().stream().flatMap(Set::stream).collect(toSet())。 -
尝试使用基本的
Set类型,例如HashSet而不是ConcurrentSkipListSet。我认为问题的一部分是代码运行得太快,并且您在对象上同时执行了多个allAll方法。HashSet应该可以解决问题。 -
这个项目使用的是 Java 8,因此我用这段代码更新了这篇文章
allClientStates.values() .stream() .flatMap(Set::stream) .collect(Collectors.toSet()); -
嘿伙计,如果我的回答解决了您的问题,请继续接受。这个网站是在志愿者的努力下运行的,至少你能做的就是感谢人们的时间。
-
进行上述更改后仍然出现concurrentModificationException异常。
标签: java concurrentmodification