繁体   English   中英

并发修改异常

[英]Concurrent modification exception

我的以下代码引发并发修改异常,但我无法解决。 救命!

  {
    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();
        }
    }
  }

替换为

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();
    }
}

解决方案是遍历整个集合而不是遍历密钥集,使用密钥集迭代器再次访问集合中的条目,并从密钥集中删除条目

用这个替换您的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