当我为集合执行addAll时出现ConcurrentModificationException



在下面的代码中,我在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": "nullnjava.util.ConcurrentModificationExceptionntat java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)ntat java.util.HashMap$KeyIterator.next(HashMap.java:1469)ntat java.util.AbstractCollection.addAll(AbstractCollection.java:343)ntat com.xxx.config.ClientDashboardConfig.getAllStates(ClientDashboardConfig.java:312)
allClientStates.values().stream()
.flatMap(keys -> keys.stream())
.collect(Collectors.toSet());

我不明白为什么需要ConcurrentSkipListSet和clientName。这个代码完整吗?

同样不清楚是否存在JVM版本限制

使用java8,你可以这样做:

allClientStates.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toSet());

最新更新