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

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