3 回答

TA貢獻1906條經驗 獲得超10個贊
Iterator it = map.entrySet().iterator();while (it.hasNext()){ Entry item = it.next(); map.remove(item.getKey());}
Iterator it = map.entrySet().iterator(); while (it.hasNext()) { Entry item = it.next(); it.remove(); }

TA貢獻2051條經驗 獲得超10個贊
Collection
Collection
Iterator
Collection
Collection
Collection
Collection.iterator()
for
Iterator.next()
for
Collection
Collection
ConcurrentModificationException
Collection
ConcurrentModificationException
.
ConcurrentModificationException
此異??赡苡蓹z測到對象的并發修改的方法引發,而這種修改是不允許的.
請注意,此異常并不總是指示對象已被不同線程并發修改。如果單個線程發出一系列違反對象契約的方法調用,該對象可能會拋出此異常.
請注意,通常情況下,不能保證快速失敗的行為在存在不同步并發修改的情況下提供任何硬的保證。失敗操作拋出 ConcurrentModificationException
在盡最大努力的基礎上。
例外 可以,可能
被扔,而不是扔 必
被拋出 不需要不同的線程。 無法保證拋出異常 拋出異常是在盡力而為的基礎上進行的。 拋出異常會發生
HashSet
, HashMap
, TreeSet
ArrayList
[直接或間接地從該類返回的迭代器]失敗快速:如果[集合]在迭代器創建后的任何時候被修改,則除通過迭代器自身的Remove方法外,以任何方式修改 Iterator
拋出 ConcurrentModificationException
..因此,在并發修改的情況下,迭代器會迅速而干凈地失敗,而不是在未來某個未定的時間冒著任意的、不確定的行為的風險。
請注意,迭代器的快速失敗行為不能保證,一般來說,在不同步并發修改的情況下不可能提供任何硬的保證。失敗快速迭代器拋出 ConcurrentModificationException
在盡最大努力的基礎上。因此,編寫一個依賴于此異常的程序是錯誤的: 迭代器的抗故障行為應該僅用于檢測bug。.
Map
非并發實現應該覆蓋此方法,并在最大努力的基礎上拋出 ConcurrentModificationException
如果檢測到映射函數在計算期間修改此映射。并發實現應該覆蓋此方法,并在最大努力的基礎上拋出 IllegalStateException
如果檢測到映射函數在計算期間修改此映射,則計算將永遠不會完成。
ConcurrentModificationException
調試 ConcurrentModificationException
ConcurrentModificationException
Collection
Collection
Collection
最常見的原因是修改 Collection
在增強的范圍內 for
循環在 Collection
..僅僅因為你沒有看到 Iterator
對象在您的源代碼中并不意味著沒有 Iterator
那里!幸運的是,有一個錯誤的說法 for
循環通常在堆棧跟蹤中,因此跟蹤錯誤通常很容易。 更棘手的情況是,當您的代碼在引用中傳遞到 Collection
對象。請注意 不可修改
收藏的視圖(如由 Collections.unmodifiableList()
)保留對可修改集合的引用,因此 (修改已在其他地方完成)。其他 意見
你的 Collection
,如 和 還保留對原始(可修改)的引用 Collection
..這可能是一個問題,即使是線程安全。 Collection
,如 不要假設線程安全(并發)集合永遠不會拋出異常。 哪些操作可以修改 Collection
在某些情況下可能是意外的。例如, 最困難的情況是例外 是
由多個線程并發修改造成的。
防止并發修改錯誤的編程
Collection
Collection
a private
Collection
Collection
Collection
Collection
添加回答
舉報