快速失敗(fail-fast) | 安全失敗(fail-safe) | |
---|---|---|
表現 | 在用迭代器遍歷一個集合對象時,如果遍歷過程中,對集合內容進行修改,則會拋出ConcurrentModificationException | 採用安全失敗機制的集合容器,在遍歷時不是直接在集合內容上訪問的,而是先複製原有集合內容 ,在拷貝 的集合上進行遍歷 |
原理 | 迭代器在遍歷時直接訪問集合中的內容,並且在遍歷過程中使用一個 modCount 變量。集合在被遍歷期間如果內容發生變化,就會改變modCount的值。每當迭代器使用hashNext()/next()遍歷下一個元素之前,都會檢測modCount變量是否爲expectedmodCount值,是的話就返回遍歷;否則拋出異常,終止遍歷 | 由於迭代時是對原集合的拷貝進行遍歷,所以在遍歷過程中對原集合所作的修改並不能被迭代器檢測到,所以不會觸發ConcurrentModificationException |
缺點 | 迭代器遍歷的是開始遍歷那一刻拿到的集合拷貝(舊的內容 ),在遍歷期間原集合發生的修改迭代器是不知道的 |
快速失敗和安全失敗是對迭代器
而言的。併發環境下建議使用
java.util 包的集合類就都是快速失敗的
java.util.concurrent
包下的類都是安全失敗
參考:
掘金大佬是這麼說的
牛客大佬上是這麼說的