java.util.ConcurrentModificationException异常原因及解决方法

这篇具有很好参考价值的文章主要介绍了java.util.ConcurrentModificationException异常原因及解决方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

java.util.ConcurrentModificationException异常原因及解决方法

通过错误提示,知道了异常出现在checkForComodification这个方法上,异常原因是modCount != expectedModCount
java.util.ConcurrentModificationException异常原因及解决方法
在网上查询得知,在很多容器中,都有一个变量记录你从结构上修改此容器的次数,叫做modCount,查看ArrayList的add()和remove()方法就可以发现,每次你调用add方法()向容器里面增加了一个元素,或者你调用Remove()方法删除了其中的某个元素,这个值都会增加1。在对集合进行迭代的时候,这个值不能被改变,否则抛出异常ConcurrentModificationException。简单地说就是你在遍历的时候,你自己不会去改变这个值,但是你在遍历的过程中发现这个值被改变了,那只有一种解释,其他人修改了集合导致这个值改变了。

java.util.ConcurrentModificationException异常原因及解决方法
而expectedModCount表示的是list容器被修改的次数的期望值,它的初始值为modCount

出现原因

java.util.ConcurrentModificationException异常原因及解决方法

我们先根据程序的代码一步一步看ArrayList源码的实现:

首先看ArrayList的iterator()方法,源码如下:

从源码上可以看出iterator()方法返回的是一个指向Itr类型对象的引用,iterator的实现,在AbstractList类中可以中找到Itr类的具体实现

java.util.ConcurrentModificationException异常原因及解决方法

每次循环都会经过两步操作,第一步是iterator.hasNext() ,判断是否有下一个元素;当我们调用list.Iterator()返回一个Iterator之后,会通过Iterator的hashNext()方法判断是否还有元素未被访问

java.util.ConcurrentModificationException异常原因及解决方法

第二步是iterator.next(),判断下一个元素是什么,并且进行赋值操作;

java.util.ConcurrentModificationException异常原因及解决方法

可以发现,在next方法中会调用checkForComodification方法,在checkForComodification()方法中,判断了modCount和expectedModCount是否相等。如果不相等,就会抛出我们遇到的这个异常。

java.util.ConcurrentModificationException异常原因及解决方法

解决办法

1、new Vector<>()

2、Collections.synchronizedList(new ArrayList<>());

使用的是Collections工具包

3、new CopyOnWriteArrayList<>();

写时复制copyOnWrite容器即写时复制的容器往容器添加元素的时候,不直接往当前容器object[]添加,而是先将当前容器object[]进行copy,复制出一个新的object[] newElements然后向新容器object[] newElements里面添加元素 添加元素后,再将原容器的引用指向新的容器setArray(newElements);
这样的好处是可以对copyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何容器,所以copyOnwrite容器也是一种读写分离的思想,读和写不同的容器文章来源地址https://www.toymoban.com/news/detail-470039.html

到了这里,关于java.util.ConcurrentModificationException异常原因及解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中java.lang.ClassCastException异常原因及解决方法

    大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在Java编程的世界中,我们经常会遇到各种异常,其中之一就是 java.lang.ClassCastException 异常。这个异常通常发生在类型转换的过程中,引起程序运行时的错误

    2024年01月17日
    浏览(39)
  • 避免低级错误:深入解析Java的ConcurrentModificationException异常

    在软件开发中,我们常常会遇到各种错误和异常。其中有一类比较低级但又常见的错误就是 ConcurrentModificationException 异常。最近了我就写了个这种异常,这个异常通常发生在使用迭代器遍历集合时,同时对集合进行修改,从而导致迭代器检测到集合结构发生变化而抛出异常。

    2024年02月15日
    浏览(42)
  • nginx405异常原因及解决方法

    nginx405异常原因与解决方法,最详细解释 访问接口出现 出现这个原因是因为当前接口没有在nginx中配置解析到的路径 例如你通过post访问了www.xxx.com/v1/getinfo 但是v1这个路径并没有在nginx中配置,所以nginx自动匹配到的就是/路径,但是/路径是访问静态资源的,只能通过get方法访

    2024年02月06日
    浏览(37)
  • 飞鱼星路由链路异常的原因以及解决方法

    对路由器的链路,相信大家一定很了解了,这里就不啰嗦了,本篇主要给大家解决路由器链路一侧连接正常,另一侧不正常的故障,组网环境为飞鱼星路由器,相信对你一定有所帮助的。   一、组网环境 路由器A与路由器B通过多模光纤互连,运行一段时间后出现路由器A一侧

    2024年02月05日
    浏览(36)
  • java.lang.IllegalStateException异常原因和解决

    Iterator.remove() 迭代删除 引发 1. Iterator.remove() 迭代删除 引发 场景示例 问题分析

    2024年02月16日
    浏览(58)
  • 空指针异常出现的几种原因及解决方法

    目录 空指针异常: 空指针容易出现的场景 避免方案 什么是空,什么是指针? 空就是 :小明过生日,小华送给了小明一个“礼物”,这个“礼物”只有一个外面的包装但是里面什么都没有,这个礼物就是\\\"\\\",而空则是小华压根没有给小华准备礼物,这个就是null。 什么是指针

    2023年04月11日
    浏览(39)
  • “No primary or single unique constructor found for interface java.util.List”问题原因及解决

    问题原因: 这个错误通常出现在使用 MyBatis 查询结果映射时,MyBatis 无法找到适合的构造方法来将查询结果转换为指定的 Java 对象。具体来说,错误信息 \\\"No primary or single unique constructor found for interface java.util.List\\\" 意味着 MyBatis 在将查询结果转换为 List 类型对象时遇到了问题,

    2024年02月09日
    浏览(56)
  • java.lang.NoSuchMethodError异常原因及解决办法

    java.lang.NoSuchMethodError异常原因及解决办法 第一种简单的情况就是本类中需要调用的方法名称错误,这种情况就需要去检查方法名称是否正确,避免调用的方法和本类中的有相同的名称。 第二种情况就是jar包的问题 可能是jar包没有导入进来或者jar包导入错误,导致出现异常。

    2024年02月11日
    浏览(56)
  • UnsupportedOperationException(不支持的操作异常)可能的原因和解决方法

    UnsupportedOperationException 表示尝试执行不支持的操作时抛出的异常。以下是可能导致此异常的一些常见原因和相应的解决方法: 使用不可变对象: 原因: 尝试在不可变对象上执行修改操作,例如在 Java 中对 String 对象调用修改方法。 解决方法: 确保你了解对象的不可变性。如

    2024年03月12日
    浏览(48)
  • Java遇到java.lang.ClassCastException异常原因和解决办法

    目录 问题描述  问题原因 解决办法 今天在进行项目运行测试时候出现如下的错误: io.github.xxyopen.novel.dto.UserInfoDto (io.github.xxyopen.novel.dto.UserInfoDto is in unnamed module of loader \\\'app\\\'; io.github.xxyopen.novel.dto.UserInfoDto is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.Rest

    2024年02月09日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包