java.util.ConcurrentModificationException 解决办法

今天写项目时,需要在一个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.csdn.net/topics/360004753

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章