java.util.ConcurrentModificationException 解决办法

本文讨论了在Java集合操作中遇到并发修改异常的原因,并提供了修改代码以避免异常发生的解决方案。

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

今天写项目时,需要在一个list中删除某个符合条件的记录,直接使用了foreach,然后再list.remove(),结果报错
//错误代码
List<TransactionLog> logs = transactionService.getLogs
       for (TransactionLog log : logs) {          
          if (log.getid() == 4)
              logs.remove(log);
}
java.util.ConcurrentModificationException
java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
java.util.ArrayList$Itr.next(ArrayList.java:851)
java.util.ConcurrentModificationException
java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
java.util.ArrayList$Itr.next(ArrayList.java:851)


//修改后

for (Iterator<TransactionLog> it = logs.iterator(); it.hasNext(); ) {
            TransactionLog log = it.next();
            
            if (log.getid() == 4)</span>
                it.remove();
        }


原因:
是这样的,你用iterator的时候,在这个迭代器上创建了一个数据结构,iterator用这个数据结构来访问这个容器,这时候如果你用容器自身的add,remove方法进行增减时,这个iterator产生的数据结构不会发生变化,所以产生异常。如果用iterator迭代器本身进行增减,则相应的数据结构也会发生变化。
避免这个异常的方法是,不要创建迭代器进行迭代的时候,不要用容器自身的方法进行增减,或者两个线程都不用迭代器,用容器自身的方法进行增减。
这个异常和你的多线程没有关系,这只是迭代器快速失败的一个特性。




参考:
http://www.cnblogs.com/frankliiu-java/articles/1759460.html
http://bbs.youkuaiyun.com/topics/360004753

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值