Java ConcurrentModificationException当我为集合执行addAll时
我在下面的代码中的Java ConcurrentModificationException当我为集合执行addAll时,java,concurrentmodification,Java,Concurrentmodification,我在下面的代码中的allStates.addAll(states)处得到一个concurrentModificationException。我怎样才能避免这种情况 public synchronized Set<String> getAllStates(String clientName, Map<String, Set<String>> allClientStates) { Set<String> allStates = new Conc
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;
}
我不明白为什么需要ConcurrentSkipListSet和clientName。这个代码完整吗 还不清楚是否存在JVM版本限制 使用java 8,您可以执行以下操作:
allClientStates.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toSet());
我不明白为什么需要ConcurrentSkipListSet和clientName。这个代码完整吗 还不清楚是否存在JVM版本限制 使用java 8,您可以执行以下操作:
allClientStates.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toSet());
你好像在别处修改地图。还请注意,似乎根本没有理由使用这些键:
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异常。你似乎在其他地方修改地图。还请注意,似乎根本没有理由使用这些键: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异常。在发布之前,我正在尝试并删除了一些其他与此功能无关的代码。因此,您可以看到ConcurrentSkipListSet和一个未使用的参数。我试试你的建议。这不能解决问题。将代码修改为后,我仍然会收到ConcurrentModificationException,当前的答案无法解决问题。我将代码更改为
Set allStates=allClientStates.values().stream().flatMap(Set::stream).collect(Collectors.toSet());`我仍然得到一个异常“``@DeepakGopal你能提供一个参数示例,这样我就可以重现这个问题吗?``final Set entrySet=allClientStates.entrySet();对于(Map.Entry key:entrySet){Set states=key.getValue();if(states!=null)allStates.addAll(states);}``这就解决了问题。感谢@GuilhermeBraboI的帮助,在我发布之前,他正在试验并删除了一些其他与此函数无关的代码。因此,您可以看到ConcurrentSkipListSet和一个未使用的参数。我试试你的建议。这不能解决问题。将代码修改为后,我仍然会收到ConcurrentModificationException,当前的答案无法解决问题。我将代码更改为
Set allStates=allClientStates.values().stream().flatMap(Set::stream).collect(Collectors.toSet());`我仍然得到一个异常“``@DeepakGopal你能提供一个参数示例,这样我就可以重现这个问题吗?``final Set entrySet=allClientStates.entrySet();对于(Map.Entry key:entrySet){Set states=key.getValue();if(states!=null)allStates.addAll(states);}``这就解决了问题。谢谢你的帮助@guilHermebrabot这并不能解决问题。将代码修改为后,我仍然会收到ConcurrentModificationException,当前的答案无法解决问题。我将代码更改为
Set allStates=allClientStates.values().stream().flatMap(Set::stream).collect(Collectors.toSet());`我仍然得到一个例外,这并不能解决问题。将代码修改为后,我仍然会收到ConcurrentModificationException,当前的答案无法解决问题。我将代码更改为
Set allStates=allClientStates.values().stream().flatMap(Set::stream).collect(Collectors.toSet());`我还是有例外````
allClientStates.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toSet());