Java的快速失敗和安全失敗
一:快速失敗(fail—fast)
在用迭代器遍歷一個集合物件時,如果遍歷過程中對集合物件的內容進行了修改(增加、刪除、修改),則會丟擲Concurrent Modification Exception。
原理:迭代器在遍歷時直接訪問集合中的內容,並且在遍歷過程中使用一個 modCount 變數。集合在被遍歷期間如果內容發生變化,就會改變modCount的值。每當迭代器使用hashNext()/next()遍歷下一個元素之前,都會檢測modCount變數是否為expectedmodCount值,是的話就返回遍歷;否則丟擲異常,終止遍歷。
注意:這裡異常的丟擲條件是檢測到 modCount!=expectedmodCount 這個條件。如果集合發生變化時修改modCount值剛好又設定為了expectedmodCount值,則異常不會丟擲。因此,不能依賴於這個異常是否丟擲而進行併發操作的程式設計,這個異常只建議用於檢測併發修改的bug。
場景:java.util包下的集合類都是快速失敗的,不能在多執行緒下發生併發修改(迭代過程中被修改)。
二:安全失敗(fail—safe)
採用安全失敗機制的集合容器,在遍歷時不是直接在集合內容上訪問的,而是先複製原有集合內容,在拷貝的集合上進行遍歷。
原理:由於迭代時是對原集合的拷貝進行遍歷,所以在遍歷過程中對原集合所作的修改並不能被迭代器檢測到,所以不會觸發Concurrent Modification Exception。
缺點:基於拷貝內容的優點是避免了Concurrent Modification Exception,但同樣地,迭代器並不能訪問到修改後的內容,即:迭代器遍歷的是開始遍歷那一刻拿到的集合拷貝,在遍歷期間原集合發生的修改迭代器是不知道的。
場景:java.util.concurrent包下的容器都是安全失敗,可以在多執行緒下併發使用,併發修改。
本文來自雲棲社群合作伙伴“開源中國”
本文作者:狼王黃師傅
相關文章
- 快速失敗機制&失敗安全機制
- git push程式碼失敗,鑑權失敗Git
- 53、快速找出不同【ctrl+】,失敗
- 以失敗為機制:奇異人生中的真實失敗與虛構性失敗
- 美團面試失敗(Java開發)面試Java
- win10系統安全登入失敗初始化失敗如何解決Win10
- Win7 Nginx啟動失敗 cmd命令失敗Win7Nginx
- 介面,失敗品
- 安裝失敗????
- 求職失敗求助!!求職
- Sentinel限流之快速失敗和漏桶演算法演算法
- dota2啟動失敗 初始化vulkan失敗
- 一次失敗的App安全測試APP
- 失敗沒關係,但一定要是“成功的”失敗(轉)
- 基於快速失敗的軟體開發 - levelup
- 建站失敗的原因分析
- 失敗的敏捷專案敏捷
- IT創業失敗案例解析4:一家失敗的招聘網站創業網站
- gitment 登入失敗Git
- 安裝scrapy失敗
- 面試又失敗了面試
- 常用失敗控制模式模式
- MySQL啟動失敗MySql
- MongoVUE 連線失敗GoVue
- 面試失敗總結面試
- MONGODB 回滾失敗MongoDB
- TX失敗策略2
- 建立函式失敗函式
- 面試外企dba失敗面試
- git merge失敗Git
- proton執行失敗
- docker啟動失敗Docker
- cmake openssl 生成失敗
- ERP的失敗箴言(轉)箴言
- 亞馬遜Alexa是如何失敗的?亞馬遜
- 一場“失敗”的突破:淺談《最後的生還者2》“失敗”的根源
- 其中一個mview失敗,一個命令來剔除失敗mview的所需的logView
- python 編譯失敗Python編譯