简体   繁体   English

并发修改异常

[英]Concurrent modification exception

My following code is throwing concurrent modification exception and I am not able to solve it. 我的以下代码引发并发修改异常,但我无法解决。 Help! 救命!

  {
    long now = new Date().getTime();
    Set<String> keyset = requests.keySet();
    Iterator<String> iterator = keyset.iterator();

    while (iterator.hasNext()) {
        String packetId = iterator.next();
        RequestHolder entry = requests.get(packetId);
        if (entry.isExpired(now)) {
            entry.getListener().onTimeout(packetId);
            iterator.remove();
        }
    }
  }

Replace your code by 替换为

long now = new Date().getTime();
Iterator<Map.Entry<String, RequestHolder>> iterator = requests.entrySet().iterator();

while (iterator.hasNext()) {
    Map.Entry<String, RequestHolder> entry = iterator.next();
    String packetId = entry.getKey();
    RequestHolder requestHolder = entry.getValue();
    if (requestHolder.isExpired(now)) {
        requestHolder.getListener().onTimeout(packetId);
        iterator.remove();
    }
}

The solution is to iterate over the whole collection and not over the key set, using the key set iterator to access entries from the collection again and removing entries from the key set 解决方案是遍历整个集合而不是遍历密钥集,使用密钥集迭代器再次访问集合中的条目,并从密钥集中删除条目

Replace your while loop with this one ... 用这个替换您的while循环...

for (Entry<String, RequestHolder> entryElem : requests.keySet()) {
            String packetId = entryElem.getValue();
        RequestHolder entry = requests.getValue.get(packetId);
        if (entry.isExpired(now)) {
            entry.getListener().onTimeout(packetId);
            iterator.remove();
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM