public class Client {
public static void main(String[] args) {
List listTemp = new ArrayList();
listTemp.add(1);
listTemp.add(2);
listTemp.add(3);
listTemp.add(4);
for(Integer i : listTemp){
listTemp.remove(i);
}
}
}
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at com.longflang.test.Client.main(Client.java:13)
原因:Collection的实现并没有同步化,如果在多 线程应用程序中出现同时访问,而且出现修改操作的时候都要求外部操作同步化;调用Iterator操作获得的Iterator对象在多线程修改Set的时 候也自动失效,并抛出java.util.ConcurrentModificationException。这种实现机制是fail-fast,对外部 的修改并不能提供任何保证。当Iterator在工作的时候,是不允许被迭代的对象被改变的。Iterator被创建的时候,建立了一个内存索引表(单链表),这 个索引表指向原来的对象,当原来的对象数量改变的时候,这个索引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是产生错误。
解决方法:
List<Integer> listTemp = new ArrayList<Integer>();
listTemp.add(1);
listTemp.add(2);
listTemp.add(3);
listTemp.add(4);
// for(Integer i : listTemp){
// listTemp.remove(i);
// }
for (int i = 0; i < listTemp.size(); i++) {
if ( 1 == listTemp.get(i)) {//判断条件
listTemp.remove(i);//移除
}
}