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包下的容器都是安全失敗,可以在多執行緒下併發使用,併發修改。
本文來自雲棲社群合作伙伴“開源中國”
本文作者:狼王黃師傅
相關文章
- 快速失敗機制&失敗安全機制
- 快速失敗是讓失敗立即快速發生! - pathelland
- git push程式碼失敗,鑑權失敗Git
- Composer 失敗
- 53、快速找出不同【ctrl+】,失敗
- 以失敗為機制:奇異人生中的真實失敗與虛構性失敗
- Win7 Nginx啟動失敗 cmd命令失敗Win7Nginx
- win10系統安全登入失敗初始化失敗如何解決Win10
- Sentinel限流之快速失敗和漏桶演算法演算法
- npm install 失敗NPM
- npm install失敗NPM
- 如何突破失敗
- git merge失敗Git
- dota2啟動失敗 初始化vulkan失敗
- 一次失敗的App安全測試APP
- 基於快速失敗的軟體開發 - levelup
- 建站失敗的原因分析
- npm install失敗的可能NPM
- 清理重建失敗的索引索引
- sqlplus啟動失敗SQL
- DATAGUARD失敗切換
- 安裝scrapy失敗
- gitment 登入失敗Git
- tomcat 啟動失敗Tomcat
- 使用 docker Composer 失敗Docker
- python 編譯失敗Python編譯
- gradle包下載失敗Gradle
- proton執行失敗
- cmake openssl 生成失敗
- docker啟動失敗Docker
- MySQL啟動失敗MySql
- easyswoole啟動失敗
- 美團面試失敗(Java開發)面試Java
- 一場“失敗”的突破:淺談《最後的生還者2》“失敗”的根源
- 如何清除建立失敗的索引索引
- pip 安裝 selenium 失敗
- matplotlib 安裝失敗,求解!
- 安裝失敗(Installing failed)AI