[英]Multiple threads using iterator.remove() on a single collection returning fail-fast iterator
[英]If Iterators returned by HashSet, ArrayList are fail-fast, how can we use iterator remove() to remove elements from Collection
眾所周知, ArrayList
, HashMap
, HashSet
等返回的Iterator
是快速失敗的,但是在使用迭代器的remove()
不會拋出ConcurrentModificationException
。 怎么樣?
如果在迭代集合時對其進行了修改,則快速失敗迭代器將引發ConcurrentModificationException
。 但是,在使用迭代器的remove()
從ArrayList
或HashSet
刪除元素時,不會引發任何ConcurrentModificationException
。 請詳細說明。
謝謝
但是在使用迭代器的remove()時不會引發ConcurrentModificationException。 怎么樣?
因為該行為已明確記錄。
對於ArrayList
:
如果在創建迭代器之后的任何時間對列表進行結構修改,除非通過迭代器自己的
remove
或add
方法,否則迭代器將拋出ConcurrentModificationException
。
對於HashSet
:
如果在創建迭代器之后的任何時候修改了集合,則除了通過迭代器自己的
remove
方法以外,都以其他方式修改了該迭代器,則Iterator拋出ConcurrentModificationException
。
相反,如果您詢問如何實現 ,那么,源代碼(至少對於OpenJDK是免費的)(並且很可能直接從您的IDE中探索):)
它的實現如下:
集合包含一個private int
成員,稱為modificationCount
(或類似的東西)。每次您使用修改集合的方法之一時,此modificationCount
都會增加。 在集合上創建迭代器時,迭代器會注意到該集合的modificationCount
的當前值,並且每次調用該迭代器時,請確保modificationCount
未被更改,以確保未修改集合。同時進行迭代。 如果迭代器發現modificationCount
已更改,則拋出ConcurrentModificationException
。
當您通過iterator
刪除時, iterator
將避免增加集合的modificationCount
。 就這么簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.