理解和解决Java并发修改异常ConcurrentModificationException

假设我们要实现这样一个例子: 判断集合里面有没有"kang"这个元素,如果有,就添加一个"is a handsome boy !"元素

public class NotSafeCollection {

    public static void main(String[] args) {
        ArrayList<String> arrayList=new ArrayList<>();
        arrayList.add("zhang");
        arrayList.add("yu");
        arrayList.add("kang");
        Iterator<String> iterator = arrayList.iterator();
        //抛出异常:java.util.ConcurrentModificationException
        while (iterator.hasNext()){
            if(iterator.next().equals("kang")){
                arrayList.add("is a handsome boy !");
            }
        }
    }
}

上面的程序会出现异常

Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
	at java.util.ArrayList$Itr.next(ArrayList.java:851)
	at com.coderman.juc.collection.NotSafeCollection.main(NotSafeCollection.java:22)

源码中: modCount != expectedModCount 修改的值不等于期望的值就会抛出该异常.

        final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
  • 1.异常解释

ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

  • 产生的原因:
    迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。

简单描述就是:迭代器遍历元素的时候,通过集合是不能修改元素的。

  • 如何解决呢?
    A:迭代器迭代元素,迭代器修改元素
    B:集合遍历元素,集合修改元素(普通for)
       for(int i=0;i<arrayList.size();i++){
            if(arrayList.get(i).equals("kang")){
                arrayList.add("is a handsome boy !");
            }
       }
# Bug   异常  

评论

公众号:mumuser

企鹅群:932154986

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×