interview: 快速失敗和安全失敗是什麼

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

快速失敗和安全失敗是對迭代器而言的。併發環境下建議使用

java.util 包的集合類就都是快速失敗的
java.util.concurrent 包下的類都是安全失敗
參考:
掘金大佬是這麼說的
牛客大佬上是這麼說的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章