并发修改异常及解决方案, java.util.ConcurrentModificationException

本文详细介绍了Java中的并发修改异常,包括异常原因、产生过程和解决方案。异常通常在使用迭代器遍历集合时,尝试修改集合结构时抛出。文章提供了解决方案,如使用迭代器的增删方法或通过索引遍历集合进行修改。
摘要由CSDN通过智能技术生成

目录

并发修改异常简介

异常展示

异常原因

异常探究

异常流程

并发修改异常出现的意义

并发修改的解决方案

1.迭代器遍历,迭代器增删元素。

解决方案1:

集合遍历元素,集合增删元素

解决方案2


并发修改异常简介

  • 什么是并发修改异常

    • 并发的意思是同时发生,并发修改的意思是在同时发生某个时间时去修改。

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

  • 场景:当我们在对集合进行迭代遍历操作的时候,如果同时对集合对象中的元素进行某些操作(增删),则容易导致并发修改异常的产生。

异常展示

  • 我们创建一个ArrayList数组,当数组中有“world”元素时,我们增加一个“javaee”元素

import java.util.ArrayList;
import java.util.Iterator;
​
public class TestDemo {
    public static void main(String[] args) {
        ArrayList<String> array = new ArrayList<>();
        //创建并添加元素
        array.add("hello");
        array.add("world");
        array.add("java");
​
        Iterator it = array.iterator();
        while (it.hasNext()){
            String s =(String) it.next();
            if ("world".equals(s)){
                array.add("javaee");
            }
        }
​
    }
}

报错原因:Exception in thread "main" java.util.ConcurrentModificationException (并发 修改异常)

异常原因

  • 通过控制台找到问题产生的根源

    Exception in thread "main" java.util.ConcurrentModificationException
        at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013)//问题根源
        at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967)
        at TestDemo.main(TestDemo.java:15)

  • 查看根源方法代码

    final void checkForComodification() {
        if (modCount != expectedModCount)
            throw new ConcurrentModificationException();//抛出并发异常
    }

  • 原因:由异常根源的方法内容得知,当一个变量modCouunt 不等于 expectedModCount变量时,会抛出此异常

异常探究

接下来探究modCount与expectedModCount具体代表什么

  • modCount

    • 在抽象类AbstractList定义了modCount变量,而作为他的子类ArrayList继承到了modCount这个变量

    • 源码中对于modCount的解释

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值