首页 > 其他分享 >ArrayList并发修改异常

ArrayList并发修改异常

时间:2024-06-19 14:13:24浏览次数:22  
标签:modCount Java 修改 ArrayList list 并发 PHP hello

遇到这么个问题:迭代器并发修改会抛出异常,这个问题之前没有遇到过,特意记录一下:

	public static void main(String[] args) {
        //创建集合对象
        List<String> list = new ArrayList<String>();
        //添加元素
        list.add("hello");
        list.add("Java");
        list.add("PHP");
        //获取迭代器
        Iterator<String> it = list.iterator();
        //遍历集合
        while (it.hasNext()) {
            System.out.println(list);
            String s = it.next();
            System.out.println(s);
            if(s.equals("PHP")) {
                list.remove("PHP");
            }
        }
    }
}
/**
 * [hello, Java, PHP]
 * hello
 * [hello, Java, PHP]
 * Java
 * [hello, Java, PHP]
 * PHP
 * [hello, Java]
 * 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.lcg.collection.arryList.iteratorDemo.Test02.main(Test02.java:28)
 */

从结果中可以看到异常是从checkForComodification方法中抛出的,而抛出该异常的条件是modCount 与expectedModCount不相等。从结果中看出虽然报异常了,但是我们想要删除的PHP元素也删除了。所以这个异常是从删除后的下一次集合调用next方法产生的。至于为什么会出现异常也就是modCount 与expectedModCount不相等原因是因为集合的remove方法中会对集合成员变量modCount和size进行修改,调用集合的remove方法后再调用next方法时此时的modCount 与expectedModCount就会不相等所以就会报异常。其实ArrayList集合不仅是remove方法会修改modCount值,其他比如add(),clear()等方法都会修改modCount。

  public static void main(String[] args) {
        //创建集合对象
        List<String> list = new ArrayList<String>();
        //添加元素
        list.add("hello");
        list.add("PHP");
        list.add("Java");
        //获取迭代器
        Iterator<String> it = list.iterator();
        //遍历集合
        while (it.hasNext()) {
            String s = it.next();
            if(s.equals("hello")) {
                it.remove();
            }
        }
        System.out.println(list);
        //[PHP, Java]
    }
	

调用迭代器中的remove方法不会有异常的原因是迭代器中的remove方法中对expectedModCount方法进行了重新赋值即expectedModCount = modCount,所以就不会出现expectedModCount与modCount不相等的情况了。

标签:modCount,Java,修改,ArrayList,list,并发,PHP,hello
From: https://www.cnblogs.com/zhangcheng1234/p/18256109

相关文章

  • 辐射4风灵月影修改器使用教程:在末世中轻松生存
    在废土世界中畅游,每个《辐射4》的玩家都梦想着拥有无尽的资源与超凡的能力,以更好地探索这个充满挑战与奇遇的后末日世界。风灵月影工作室为我们带来了强大的《辐射4》修改器,它不仅能够极大地丰富你的游戏体验,还能让你的角色瞬间成为废土之上的不朽传奇。本文将详尽指导你如何使......
  • 【面试实战】# 并发编程
    1.线程状态请解释Java中线程的几种状态,并描述每种状态的特点和转换条件。NEW(新建):线程被创建,但尚未启动。RUNNABLE(可运行):线程正在运行,可能在执行代码,也可能等待操作系统资源。BLOCKED(阻塞):线程在等待监视器锁,以便进入同步块/方法。WAITING(等待):线程等待另一个线程显式地唤......
  • JUC并发编程第十四章——线程安全集合类
    1 并发集合1.1 线程安全集合分类a.遗留的线程安全集合遗留的线程安全集合如Hashtable,Vectorb.使用Collections装饰的线程安全集合使用Collections装饰的线程安全集合,如:Collections.synchronizedCollectionCollections.synchronizedListCollections.synchroni......
  • Go并发相关
    map是并发安全的吗?首先我们写一段程序验证一下,创建两个goroutine,同时对一个map进行写操作,看看会发生什么吧!funcmain(){m:=make(map[string]int)m["foo"]=1varwgsync.WaitGroupwg.Add(2)gofunc(){fori:=0;i<1000;i++{......
  • 随着技术的不断发展,Perl 在处理大规模数据和高并发场景下的性能优化策略有哪些?
    Perl在处理大规模数据和高并发场景下的性能优化策略有以下几点:选择合适的数据结构:对于大规模数据,选择合适的数据结构可以提高Perl程序的性能。例如,使用数组而不是哈希表可以节省内存和加快访问速度。使用内置函数和操作符:Perl提供了许多内置函数和操作符,它们通常比自定......
  • Vue3鼠标悬浮个人头像时出现修改头像,点击出现弹框,上传头像使用cropperjs可裁剪预览
    实现效果:鼠标悬浮到头像上,下方出现修改头像点击修改头像出现弹框,弹框中可上传头像,并支持头像的裁剪及预览 实现方式: 1.tempalte中<divclass="img-box"> <imgv-if="avatarImgUrl":src="avatarImgUrl"class="avatar"/> <divclass="text"@......
  • 【java】为什么高并发下数据写入不推荐关系数据库?
    一、问题解析说到高并发写,就不得不提及新分布式数据库HTAP,它实现了OLAP和OLTP的融合,可以同时提供数据分析挖掘和关系查询。事实上,HTAP的OLAP并不是大数据,或者说它并不是我们印象中每天拿几T的日志过来用于离线分析计算的那个大数据。这里更多的是指数据挖掘的最后一环,也就是......
  • MySQL:创建账户及修改密码
    1、创建账户MySQL5.8:grantallprivilegeson*.*totst@%identifiedby'123456';MySQL8.0:createuser'tst'@'%'identifiedby'123456';grantallprivilegeson*.*to'tst'@'%'withgrantoption;......
  • 【YOLOv10改进[注意力]】在YOLOv10中添加坐标注意力CoordAtt + 含全部代码和详细修改
    本文将进行在YOLOv10中添加坐标注意力CoordAtt的实践,助力YOLOv10目标检测效果的实践,文中含全部代码、详细修改方式以及手撕结构图。助您轻松理解改进的方法。改进前和改进后的参数对比: 目录一CoordAtt二在YOLOv10中添加注意力CoordAtt的实践1整体修改......
  • 【YOLOv10改进[注意力]】在YOLOv10中使用注意力MLCA的实践+ 含全部代码和详细修改方式
    本文将进行在YOLOv10中添加注意力MLCA的实践,助力YOLOv10目标检测效果的实践,文中含全部代码、详细修改方式以及手撕结构图。助您轻松理解改进的方法。改进前和改进后的参数对比: 目录一MLCA二在YOLOv10中使用注意力MLCA的实践1整体修改......