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和fail-safeJavaAIAST
- Java容器系列-Fail-Fast機制到底是什麼JavaAIAST
- Fail-fast 機制分析AIAST
- Java集合詳解3:Iterator,fail-fast機制與比較器JavaAIAST
- fail-fast和fail-safeAIAST
- Java集合詳解3:一文讀懂Iterator,fail-fast機制與比較器JavaAIAST
- 一不小心就讓Java開發踩坑的fail-fast是個什麼鬼?JavaAIAST
- ArrayList原始碼解析之fail-fast機制深入理解原始碼AIAST
- 談談fail-fast與fail-safe是什麼以及工作機制AIAST
- 基於原始碼去理解Iterator迭代器的Fail-Fast與Fail-Safe機制原始碼AIAST
- 【面試普通人VS高手系列】Fail-safe機制與Fail-fast機制分別有什麼作用面試AIAST
- Java SE, Java EE, Java MEJava
- Java 解惑(Java Puzzler)Java
- 【Java】A Guide to the Java ExecutorServiceJavaGUIIDE
- 【Java】The Java Headless ModeJava
- JAVA java學習(24)——————java修飾符Java
- Java 陣列、Java 日期時間、Java 正規表示式、Java 方法Java陣列
- 【Java筆記】Java JDKJava筆記JDK
- 淺析Java反射--JavaJava反射
- Java 8 + 10 = Java 18Java
- Java 安全之Java AgentJava
- Java筆記-Java反射(二)Java筆記反射
- Java基礎類庫【Java】Java
- Java基礎系列—Java反射Java反射
- Java:Java的物件導向Java物件
- java分散式(java入門)Java分散式
- Java學習—java-RedisJavaRedis
- JAVA-java日期工具類Java
- Treasure Of JAVA——JAVA的資料型別(JAVA面試題)Java資料型別面試題
- JAVA學習筆記—JAVA WEB(二)JAVA WEB核心(下)Java筆記Web
- JavaJava
- ```javaJava
- 《Effective Java》--Java進階必備Java
- java原始碼-java.util.ListJava原始碼
- 【Java反射】Java 泛型基礎Java反射泛型
- 【java學習】JDK(Java Development Kit)JavaJDKdev