前段時間一個小夥伴去面試,遇到這樣一個問題。
”Fail-safe機制與Fail-fast機制分別有什麼作用“
他說他聽到這個問題的時候,腦子裡滿臉問號。那麼今天我們來看一下,關於這個問題,普通人和高手應該如何回答吧。
普通人的回答
額… . 嗯 …
高手的回答
Fail-safe和Fail-fast,是多執行緒併發操作集合時的一種失敗處理機制。
Fail-fast : 表示快速失敗,在集合遍歷過程中,一旦發現容器中的資料被修改了,會立刻丟擲ConcurrentModificationException異常,從而導致遍歷失敗,像這種情況
定義一個Map集合,使用Iterator迭代器進行資料遍歷,在遍歷過程中,對集合資料做變更時,就會發生Fail-fast。
java.util包下的集合類都是快速失敗機制的, 常見的的使用Fail-fast方式遍歷的容器有HashMap和ArrayList等。
Fail-safe:表示失敗安全,也就是在這種機制下,出現集合元素的修改,不會丟擲ConcurrentModificationException。
原因是採用安全失敗機制的集合容器,在遍歷時不是直接在集合內容上訪問的,而是先複製原有集合內容,
在拷貝的集合上進行遍歷。由於迭代時是對原集合的拷貝進行遍歷,所以在遍歷過程中對原集合所作的修改並不能被迭代器檢測到
比如這種情況
定義了一個CopyOnWriteArrayList,在對這個集合遍歷過程中,對集合元素做修改後,不會丟擲異常,但同時也不會列印出增加的元素。
java.util.concurrent包下的容器都是安全失敗的,可以在多執行緒下併發使用,併發修改。
常見的的使用Fail-safe方式遍歷的容器有ConcerrentHashMap和CopyOnWriteArrayList等。
總結
好的, Fail-safe和Fail-fast 的作用,你理解了嗎?
你們是否有更好的回答方式? 歡迎在評論區給我留言!
本期的普通人VS高手面試系列就到這裡結束了,喜歡的朋友記得一鍵三連,加個關注。
我是Mic,一個工作了14年的Java程式設計師,我們們下篇文章再見。