集合操作的ConcurrentModificationException
来源:互联网 发布:php未来10年发展 编辑:程序博客网 时间:2024/06/01 10:30
1.产生情景
在做项目中遇到如下需求:遍历集合,删除其中值=2的元素。代码如下:
@Testpublic void test() {List<Integer> list = new ArrayList<Integer>();list.add(0);list.add(1);list.add(2);list.add(3);list.add(4);for (Integer integer : list) {if (integer==2) {list.remove(2);}}}运行后抛出如下异常:
java.util.ConcurrentModificationExceptionat java.util.AbstractList$Itr.checkForComodification(Unknown Source)at java.util.AbstractList$Itr.next(Unknown Source)at com.mycompany.app.ConcurrentModifyTest.test(ConcurrentModifyTest.java:22)
2.产生原因
ArrayList等的Collection的实现并没有同步化(也就是没有synchronized),如果在多线程应用中出现同时访问和修改时,要求外部操作必须要同步,如果不是同步就会抛出这个异常。
简单地说就是:不能在遍历的时候通过list、map等容器本身删除其中的元素
3.单线程的解决方案
既然不能通过容器来删除,那么就使用迭代器本身的remove方法来删除即可
@Testpublic void test() {List<Integer> list = new ArrayList<Integer>();list.add(0);list.add(1);list.add(2);list.add(3);list.add(4);Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()) {Integer i = iterator.next();if (i==2) {iterator.remove();}}}
4.多线程的解决方案
单线程的解决方案在多线程情况下就不适用了,而且就算是将ArrayList换为同步容器Vector也还是会出现这种问题。
解决方案有以下两种:
(1)使用并发容器(推荐)
如CopyOnWriteArrayList代替ArrayList和Vector,用ConcurrentHashMap代替HashMap
(2)通过synchronized或者Lock将iterator操作放入其中 0 0
- 集合操作的ConcurrentModificationException
- 关于java集合的遍历以及ConcurrentModificationException(并发操作异常)
- 集合ConcurrentModificationException
- ConcurrentModificationException遍历集合时,不能对集合进行修改操作
- 集合的遍历(多线程)及ConcurrentModificationException
- java 并发操作list集合导致java.util.ConcurrentModificationException
- java 并发操作list集合导致java.util.ConcurrentModificationException
- 集合操作的ConcurrentModificationException异常分析,为什么有时候循环remove不会异常?Iterator方式也会异常吗?
- 集合 ConcurrentModificationException 详解
- 遍历集合ConcurrentModificationException异常
- JAVA集合中删除元素时的java.util.ConcurrentModificationException
- java同步集合类以及java.util.ConcurrentModificationException的原因
- ConcurrentModificationException:并发的修改错误(常见于集合)
- 在迭代一个集合的时候,如何避免ConcurrentModificationException
- java集合遍历引起ConcurrentModificationException的原因分析
- 集合中的Iterator抛出的ConcurrentModificationException源码分析
- Android 集合操作关于Exception in thread "main" java.util.ConcurrentModificationException
- Java 集合框架分析:ConcurrentModificationException
- duilib按钮的右击事件
- debian下安装jdk
- C/C++程序从编译到最终生成可执行文件的过程分析
- J2EE是什么(一)
- 百度地图API显示多个标注点带提示的代码
- 集合操作的ConcurrentModificationException
- webstorm 使用
- 【Java安全技术探索之路系列:Java可扩展安全架构】之四:JCA(三):JCA编程模型
- 关于Oozie的input-events和done-flag
- 自定义view(一)
- From-Linear-Model-to-Generalized-Linear-Model-Part 1
- onotoone一对一主键关联,懒加载
- hdu 2444 The Accomodation of Students 【二分图判断+求最大匹配】
- 6. 创建版本库