Fail-Fast in Java
A fail-fast system is nothing but immediately report any failure that is likely to lead to failure. When a problem occurs, a fail-fast system fails immediately. In Java, we can find this behavior with iterators. Incase, you have called iterator on a collection object, and another thread tries to modify the collection object, then concurrent modification exception will be thrown. This is called fail-fast.
Fail-Fast:又稱“快速失敗”或“早期失敗”是一個軟體工程概念,是指當異常發生時,立即停止執行以防止複雜問題的發生。
在Java語言中,由集合類比如:ArrayList, HashSet, Vector等等所返回的迭代器物件都是Fail-Fast的,也就是說,當你通過迭代器Iterator來遍歷集合內的物件,同時又對集合進行修改(增加add或者刪除remove)操作時,就會丟擲ConcurrentModificationException異常。
我們看下面這個例子:
List<Integer> ints = new ArrayList<>(asList(1, 2, 3, 4, 5, 6, 9, 15, 67, 23, 22, 3, 1, 4, 2));
for (Integer i : ints) {
// some code
ints.add(57); // throws java.util.ConcurrentModificationException
}
當你執行時,你就會得到以下異常:
Exception in thread "main" java.util.ConcurrentModificationException
1
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at simulate.SetTest.main(SetTest.java:40)
在Java 8u20 發行版本中,Collections.sort()同樣也是一個Fail-Fast,這也意味著你無法在對集合迭代遍歷的同時執行Collections.sort()排序操作,比如類似下面這樣:
List<Integer> ints = new ArrayList<>(asList(1, 2, 3, 4, 5, 6, 9, 15, 67));
for (Integer i : ints) {
// some code
Collections.sort(ints);
}
這麼設計是有意義的,如果你在迭代遍歷的同時執行排序操作,不僅違反正常的語義,而且還容易引起未知的後果,當然,你在呼叫Collections.sort()方法之後,立即跳出迭代(break),那就不會引起該異常,但通常這不是推薦做法。
List<Integer> ints = new ArrayList<>(asList(1, 2, 3, 4, 5, 6, 9, 15, 67));
for (Integer i : ints) {
// some code
Collections.sort(ints);
break;
}
相關文章
- [Java基礎]Fail-FastJavaAIAST
- Java,你告訴我 fail-fast 是什麼鬼?JavaAIAST
- Java容器系列-Fail-Fast機制到底是什麼JavaAIAST
- 深入理解Java中的fail-fast和fail-safeJavaAIAST
- Fail-fast 機制分析AIAST
- Java集合詳解3:Iterator,fail-fast機制與比較器JavaAIAST
- fail-fast和fail-safeAIAST
- Fail-Fast機制詳解AIAST
- Java集合詳解3:一文讀懂Iterator,fail-fast機制與比較器JavaAIAST
- 一不小心就讓Java開發踩坑的fail-fast是個什麼鬼?JavaAIAST
- ArrayList原始碼解析之fail-fast機制深入理解原始碼AIAST
- Java集合系列:-----------04fail-fast總結(通過ArrayList來說明fail-fast的原理以及解決辦法)...JavaAIAST
- 談談fail-fast與fail-safe是什麼以及工作機制AIAST
- 基於原始碼去理解Iterator迭代器的Fail-Fast與Fail-Safe機制原始碼AIAST
- 【面試普通人VS高手系列】Fail-safe機制與Fail-fast機制分別有什麼作用面試AIAST
- 【JAVA】java使用Java
- JAVA(三)JAVA常用類庫/JAVA IOJava
- Java 解惑(Java Puzzler)Java
- Java打劫(The Java Heist)Java
- JAVA java學習(24)——————java修飾符Java
- Java 陣列、Java 日期時間、Java 正規表示式、Java 方法Java陣列
- Java 安全之Java AgentJava
- 淺析Java反射--JavaJava反射
- Java 8 + 10 = Java 18Java
- 【Java】A Guide to the Java ExecutorServiceJavaGUIIDE
- 【Java】The Java Headless ModeJava
- 【Java筆記】Java JDKJava筆記JDK
- JAVA面試題 java部分Java面試題
- java基礎-java NIOJava
- java之JAVA異常Java
- java日期 java陣列Java陣列
- Java from SUN & Son of JavaJava
- java Java與編碼Java
- Treasure Of JAVA——JAVA的資料型別(JAVA面試題)Java資料型別面試題
- Java筆記-Java反射(二)Java筆記反射
- Java基礎類庫【Java】Java
- Java學習—java-RedisJavaRedis
- Java:Java的物件導向Java物件