java.util.ConcurrentModificationException 解决办法

原创 javahashmap

在使用 iterator.hasNext() 操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除。

则使用会报以下异常:

java.util.ConcurrentModificationException
        at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
        at java.util.HashMap$KeyIterator.next(HashMap.java:828)

例如以下程序(转自互联网):

import mport java.util.*;

public class Main
{
    public static void main(String args[])
    {
        Main main = new Main();
        main.test();
    }

    public void test()
    {
        Map bb = new HashMap();
        bb.put("1", "wj");
        bb.put("2", "ry");
        Iterator it = bb.keySet().iterator();
        while(it.hasNext()) {
            Object ele = it.next();
            bb.remove(ele);    //wrong
        }
        System.out.println("Success!");
    }
}

原因:Iterator 做遍历的时候,HashMap 被修改 (bb.remove(ele), size-1),Iterator(Object ele=it.next()) 会检查 HashMap 的 size,size 发生变化,抛出错误 ConcurrentModificationException

解决办法:

  1. 通过 Iterator 修改 Hashtable
while(it.hasNext()) {
    Object ele = it.next();
    it.remove();
}
  1. 根据实际程序,您自己手动给 Iterator 遍历的那段程序加锁,给修改 HashMap 的那段程序加锁。

  2. 针对Map,使用 ConcurrentHashMap 替换 HashMap,ConcurrentHashMap 会自己检查修改操作,对其加锁,也可针对插入操作。

import java.util.concurrent.*;
如果觉得这对你有用,请随意赞赏,给与作者支持
评论 0
最新评论