java.util.ConcurrentModificationException 异常
程序员文章站
2022-05-23 11:41:59
...
在对Vector、ArrayList做迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常。
--注:像使用for-each进行迭代实际上也会出现这种问题。
public
class
Test {
public
static
void
main(String[] args) {
ArrayList<Integer> list =
new
ArrayList<Integer>();
list.add(
2
);
Iterator<Integer> iterator = list.iterator();
while
(iterator.hasNext()){
Integer integer = iterator.next();
if
(integer==
2
)
list.remove(integer);
}
}
}
运行结果:
在单线程环境下的解决办法:
在迭代器中如果要删除元素的话,需要调用Itr类的remove方法。
将上述代码改为下面这样就不会报错了:
public
class
Test {
public
static
void
main(String[] args) {
ArrayList<Integer> list =
new
ArrayList<Integer>();
list.add(
2
);
Iterator<Integer> iterator = list.iterator();
while
(iterator.hasNext()){
Integer integer = iterator.next();
if
(integer==
2
)
iterator.remove();
//注意这个地方
}
}
}
在多线程环境下的解决方法
一般有2种解决办法:
1)在使用iterator迭代的时候使用synchronized或者Lock进行同步;
2)使用并发容器CopyOnWriteArrayList代替ArrayList和Vector。
详细原因及解决方法见:http://www.cnblogs.com/dolphin0520/p/3933551.html
上一篇: 优化。
下一篇: ASM使用时的注意事项
推荐阅读
-
应用程序发生异常 unknown software exception的解决方法
-
解决spring @ControllerAdvice处理异常无法正确匹配自定义异常
-
电脑开机出现异常提示keyboard not found的故障原因及解决方法
-
数据库访问异常Access denied for user ''@'localhost' to database 'xinjisudi'
-
C语言异常处理机制案例讲解
-
异常(exception)和执行失败有什么区别?
-
解决mysql时区与系统时区不一致问题。异常:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized o
-
struts2 使用拦截器记录异常日志
-
Python异常处理与反射相关问题总结
-
struts2 使用拦截器记录异常日志