簡體   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