当我们运行如下代码时:会产生并发的修改异常java.util.ConcurrentModificationException,其原因是迭代集合的时间不能够对集合进行修改。

package andy.thread.test;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class CollectionModifyExceptionTest {public static void main(String[] args) {Collection<User> users = new ArrayList<User>();users.add(new User("张三", 28));users.add(new User("李四", 25));users.add(new User("王五", 31));Iterator<User> itrUsers = users.iterator();while (itrUsers.hasNext()) {User user = (User) itrUsers.next();if ("张三".equals(user.getName())) {users.remove(user);// itrUsers.remove();} else {System.out.println(user);}}}static class User {private String name;private Integer age;public User() {}public User(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}}
}

会抛出如下的异常:

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at andy.thread.test.CollectionModifyExceptionTest.main(CollectionModifyExceptionTest.java:17)

但是当我们删除李四时却没有抛错误。

查看源码之后我们就可已清楚的了解,删除李四时,其迭代器中  boolean hasNext();返回为false,没有执行一下代码;而删除第一个和第五个时,会产生期望值和list的值不相等,就抛出异常。

private void checkForComodification() {
            if (ArrayList.this.modCount != this.modCount)
                throw new ConcurrentModificationException();
        }

JDK1.5之后,给我们提供了CopyOnWriteArrayList

这种方法可能比其他替代方法 有效。在不能或不想进行同步遍历,但又需要从并发线程中排除冲突时,它也很有用。“快照”风格的迭代器方法在创建迭代器时使用了对数组状态的引用。此数组在迭代器的生存期内不会更改,因此不可能发生冲突,并且迭代器保证不会抛出 ConcurrentModificationException。创建迭代器以后,迭代器就不会反映列表的添加、移除或者更改。在迭代器上进行的元素更改操作(removesetadd)不受支持。这些方法将抛出 UnsupportedOperationException

修改代码:

package andy.thread.test;import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;public class CollectionModifyExceptionTest {public static void main(String[] args) {Collection<User> users = new CopyOnWriteArrayList<>();users.add(new User("张三", 28));users.add(new User("李四", 25));users.add(new User("王五", 31));Iterator<User> itrUsers = users.iterator();while (itrUsers.hasNext()) {User user = (User) itrUsers.next();if ("张三".equals(user.getName())) {users.remove(user);// itrUsers.remove();} else {System.out.println(user);}}}static class User {private String name;private Integer age;public User() {}public User(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}}
}

就不会有问题。

多线程之操作CopyOnWriteArrayList解决Iterator迭代器产生java.util.ConcurrentModificationException相关推荐

  1. php 迭代器迭代中文时重复,3种方式解决iterator迭代器并发修改异常

    3种方式解决iterator迭代器并发修改异常ConcurrentModificationException 在使用迭代器的时候,时长会遇到 ConcurrentModificationExcepti ...

  2. java.util.ConcurrentModificationException: null异常(已解决,原因出自于Java集合的快速失败机制)

    问题来源 今天我在写项目时,对集合中的元素做了以下操作 报错信息如图 问题来源: 在Java中对集合进行遍历时,一旦对集合进行增删操作,在遍历时会引起java.util.ConcurrentModif ...

  3. java.util.ConcurrentModificationException 解决办法

    在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除. 则使用会报以下异常: Java.util.ConcurrentModifi ...

  4. (转)Exception in thread main java.util.ConcurrentModificationException异常怎么解决?

    [转载原因:同样遇到set的foreach遍历中调用remove方法,导致这个错误.] [转载原文:https://blog.csdn.net/jdk_wangtaida/article/detail ...

  5. 出现 java.util.ConcurrentModificationException 时的解决办法

    for (int i=0; i<list.size(); i++) { // 只有在这种方式遍历集合时,同时对集合增加.删除才不会影响. // list.remove(list.get(i)); ...

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

    java.util.ConcurrentModificationException异常原因及解决方法 参考文章: (1)java.util.ConcurrentModificationExceptio ...

  7. 使用Iterator 或for-each注意:java.util.ConcurrentModificationException

    使用Iterator 或for-each注意:java.util.ConcurrentModificationException Posted on 2010-03-02 12:22 Fingki.l ...

  8. java 循环删除hashmap中的键值对,解决java.util.ConcurrentModificationException报错

    示例 import java.util.HashMap; import java.util.Iterator; import java.util.Map;public class DeleteHash ...

  9. date设置时间_解决 IDEA 无法找到 java.util.Date 的问题

    原文首发于 https://studyidea.cn/ 问题 最近在项目中频繁使用到 java.util.Date,但是使用 IDEA 提示查找 Date 类,却无法找到 java.util.Date ...

  10. [解决办法] Caused by: java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0

    原始代码 select regexp_replace(string_data, "\\*+", "%") as new_string from test_tb ...

最新文章

  1. 机器学习笔记 invariance data augmentation
  2. SVN mime-type 笔记
  3. SAP CRM product hierarchy和category的三个问题问答
  4. pythonjavascript一起开发_Python开发【第十一篇】:JavaScript
  5. Windows管道技术
  6. Bootstrap 滚动监听插件Scrollspy 的方法
  7. 完了!CPU 一味求快出事儿了!| 原力计划
  8. 考研英语作文:环保呼吁信
  9. C语言汇编-函数调用栈
  10. MySQL安装包MySQL Installer下载地址
  11. QQ的clientkey与淘宝旺旺Token 不同平台环境下的登录认证
  12. 如何看待网络直播中的弹幕文化?
  13. 新浪微博开发者平台应用申请及配置说明
  14. MySQL数据库 CPU飙升到100%
  15. 北京家庭摇号计算机,北京摇号积分计算|2021北京家庭摇号积分怎么算? 北京家庭积分摇号计算 - 有车一族汽车网...
  16. html让video元素居中,CSS实现元素居中的五种方法
  17. scrapy_redis去重优化(已有7亿条数据),附Demo福利
  18. 当别人对自己有意见时,怎么处理?
  19. 为什么你会觉得苹果已无创新?耶稣已死,商人掌舵!!
  20. python测试框架untest_python自动化测试框架unittest

热门文章

  1. 480.滑动窗口中位数
  2. java中代码pu_一、线程Java代码实现1.继承Thread声明Thread的子类public class MyThread extends Thread { pu...
  3. 如何找mysql8.0的rpm安装包_centos7上mysql8.0rpm方式安装
  4. 中调用view_在 View 上使用挂起函数
  5. python graphviz_Python中Graphviz的输出问题
  6. 凸优化第七章统计估计 7.3最优检测器设计及假性检验
  7. 协同过滤算法:在线推荐系统如何工作?
  8. android studio for android learning (七) Android Log类全解
  9. 【洛谷 P3979】遥远的国度【树链剖分、换根】
  10. 【Gym - 101234J】Zero Game【单调队列】