首页 > 解决方案 > 当我为 Set 执行 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": "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)

标签: javaconcurrentmodification

解决方案


allClientStates.values().stream()
    .flatMap(keys -> keys.stream())
    .collect(Collectors.toSet());

推荐阅读