3 回答

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