Connection关于java.util.ConcurrentModificationException的处理

本文深入探讨了Java中并发修改异常(ConcurrentModificationException)的原因及其解决方案。通过具体代码示例展示了在使用Iterator进行元素移除时如何避免该异常的发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);//移除
   }
  }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值