深入理解Java中的fail-fast和fail-safe
什麼是快速失敗(fail-fast)和安全失敗(fail-safe)?它們又和什麼內容有關係。以上兩點就是這篇文章的內容,廢話不多話,正文請慢用。
我們都接觸 HashMap、ArrayList 這些集合類,這些在 java.util 包的集合類就都是快速失敗的;而 java.util.concurrent 包下的類都是安全失敗,比如:ConcurrentHashMap。
快速失敗(fail-fast)
在使用迭代器對集合物件進行遍歷的時候,如果 A 執行緒正在對集合進行遍歷,此時 B 執行緒對集合進行修改(增加、刪除、修改),或者 A 執行緒在遍歷過程中對集合進行修改,都會導致 A 執行緒丟擲 ConcurrentModificationException 異常。
具體效果我們看下程式碼:
執行後的效果如下圖:
為什麼在用迭代器遍歷時,修改集合就會拋異常時?
原因是迭代器在遍歷時直接訪問集合中的內容,並且在遍歷過程中使用一個 modCount 變數。集合在被遍歷期間如果內容發生變化,就會改變 modCount 的值。
每當迭代器使用 hashNext()/next() 遍歷下一個元素之前,都會檢測 modCount 變數是否為 expectedModCount 值,是的話就返回遍歷;否則丟擲異常,終止遍歷。
安全失敗(fail-safe)
明白了什麼是快速失敗之後,安全失敗也是非常好理解的。
採用安全失敗機制的集合容器,在遍歷時不是直接在集合內容上訪問的,而是先複製原有集合內容,在拷貝的集合上進行遍歷。
由於迭代時是對原集合的拷貝進行遍歷,所以在遍歷過程中對原集合所作的修改並不能被迭代器檢測到,故不會拋 ConcurrentModificationException 異常
我們上程式碼看下是不是這樣
執行效果如下,的確不會拋異常,程式正常執行。
最後說明一下,快速失敗和安全失敗是對迭代器而言的。併發環境下建議使用 java.util.concurrent 包下的容器類,除非沒有修改操作。
歡迎工作一到五年的Java工程師朋友們加入Java填坑之路:860113481
群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用”沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!
相關文章
- fail-fast和fail-safeAIAST
- 基於原始碼去理解Iterator迭代器的Fail-Fast與Fail-Safe機制原始碼AIAST
- Java中Thread 和Runnable 深入理解Javathread
- 深入理解Java中的鎖Java
- 深入理解Java中的AQSJavaAQS
- 深入理解 Java 中的 LambdaJava
- 深入理解Java中的鎖(二)Java
- 深入理解Java中的鎖(一)Java
- 深入理解Java中的Garbage CollectionJava
- 深入理解Java中的逃逸分析Java
- ArrayList原始碼解析之fail-fast機制深入理解原始碼AIAST
- 談談fail-fast與fail-safe是什麼以及工作機制AIAST
- 深入理解Java中的不可變物件Java物件
- JAVA中鎖的深入理解與解析Java
- Fail-Fast in JavaAIASTJava
- 深入理解Java中的volatile關鍵字Java
- 深入理解JavaScript中的WeakMap和WeakSetJavaScript
- 深入理解python中的類和物件Python物件
- 深入理解Swift中的Class和StructSwiftStruct
- 深入理解 Java 中 SPI 機制Java
- 深入理解 Java 反射和動態代理Java反射
- 深入理解Java ClassLoader及在 JavaAgent 中的應用Java
- 深入理解 Go 中的 new() 和 make() 函式Go函式
- Vue中keep-alive的深入理解和使用VueKeep-Alive
- 深入理解Java PriorityQueueJava
- 深入理解 Java 方法Java
- 深入理解Java反射Java反射
- Java:IO:深入理解Java
- [Java基礎]Fail-FastJavaAIAST
- 夯實Java基礎系列13:深入理解Java中的泛型Java泛型
- JS中this的深入理解JS
- 深入理解Js中的thisJS
- 深入理解Java中的底層阻塞原理及實現Java
- 深入理解Java中的反射機制和使用原理!詳細解析invoke方法的執行和使用Java反射
- 深入理解 Java 泛型Java泛型
- 深入理解 Java 註解Java
- Java集合——深入理解HashMapJavaHashMap
- 深入理解 Java 列舉Java