Fail-fast總結:
1. Fail-fast機制式java集合中的一種異常機制。當多個線程對同一個集合的內容進行操作時,就可能會產生fail-fast。拋出java.util.ConcurrentModificationException異常時,也即產生fail-fast事件
2. Fail-fast機制,是一種錯誤檢測機制。它只能被用來檢測錯誤,因爲JDK並不保證fail-fast機制一定會發生。若在多線程環境下使用fail-fast機制的集合,建議使用java.util.concurrent包下的的類去取代java.util包下的類。
3. Fail-fast原理
產生fail-fast事件,是通過拋出ConcurrentModificationException異常來觸發的。
那麼,ArrayList是如何拋出ConcurrentModificationException異常的呢? 我們知道,ConcurrentModificationException是在操作Iterator時拋出的異常。若modCount不等於expectedModCount,則拋出ConcurrentModificationException異常,產生fail-fast機制。
Fail-fast是如何產生的?
當多個線程對同一個集合進行操作的時候,某線程訪問集合的過程中,該集合的內容被其他線程所改變(即其它線程通過add、remove、clear等方法,改變了modCount的值);這時,就會拋出ConcurrentModificationException異常,產生fail-fast事件。
Fail-fast和fail-safe的區別
|
Fail-fast |
Fail-safe |
ConcurrentModificationException |
Yes |
No |
Clone object |
No |
Yes |
Memory overhead |
No |
yes |
Examples |
HashMap ArrayList HashSet Vector |
CopyOnWriteArrayList concurrentHashMap |