什么是并发修改异常?
ConcurrentModificationException异常是一个RuntimeException,并发访问容器出错时抛出
集合元素删除方式 :
① 集合 : remove(obj/index)
② 迭代器: remove()
注意: 当在遍历时,使用集合的删除方法,可能会导致ConcurrentModificationException 并发修改异常。
建议用迭代器的删除方法。
public class 并发修改异常 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
for (String string : list) {
if (string.equals("c")) {
list.remove(string);
}
System.out.println(string);
}
}
}
为什么使用集合的删除方法,会导致并发修改异常?
个人理解:
集合在使用增强for遍历的时候(增强for的实现原理就是用迭代器进行遍历),在遍历之前迭代器的长度与list的长度是一样的,在遍历过程中,list修改了集合长度,而迭代器却不知道,这就造成了迭代器和list集合的实际长度不一致,就会发生错误
从多线程的角度来看,迭代器和list是两个线程,当迭代器进行遍历的时候,另一个线程list对集合容器进行了修改,然而这时不允许的,所以报ConcurrentModificationException并发修改异常。