天天看點

【原創】通過使用集合的疊代器進行更新、删除等操作時,出現java.util.ConcurrentModificationException 解決辦法。...

在項目的中有一個需求,需要在一個Set類型的集合中删除滿足條件的對象,這時想當然地想到直接調用Set的remove(Object o)方法将指定的對象删除即可。

但運作程式的時候,卻發現出錯了:

Exception in thread "main" java.util.ConcurrentModificationException

    at java.util.HashMap$HashIterator.nextEntry(Unknown Source)

    at java.util.HashMap$KeyIterator.next(Unknown Source)

    at test.Test.main(Test.java:23)

從API中可以看到List等Collection的實作并沒有同步化,如果在多線程應用程式中出現同時通路,而且出現修改操作的時候都要求外部操作同步化;調用Iterator操作獲得的Iterator對象在多線程修改Set的時候也自動失效,并抛出java.util.ConcurrentModificationException。這種實作機制是fail-fast,對外部的修改并不能提供任何保證。

Iterator是工作在一個獨立的線程中,Iterator被建立的時候,建立了一個記憶體索引表(單連結清單),這個索引表指向原來的對象,當原來的對象數量改變的時候,這個索引表的内容沒有同步改變,是以當索引指針往下移動的時候,便找不到要疊代的對象,于是産生錯誤。List、Set等是動态的,可變對象數量的資料結構,但是Iterator則是單向不可變,隻能順序讀取,不能逆序操作的資料結構,當 Iterator指向的原始資料發生變化時,Iterator自己就迷失了方向。

如何才能滿足需求呢,需要再定義一個List,用來儲存需要删除的對象。

下一篇: nmap參數

繼續閱讀