Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ConcurrentModificationException当我为集合执行addAll时_Java_Concurrentmodification - Fatal编程技术网

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())更新了这篇文章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,当前的答案无法解决问题。我将代码更改为
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());