面試官:說說快速失敗和安全失敗是什麼

什麼是快速失敗(fail-fast)和安全失敗(fail-safe)?它們又和什麼內容有關係。以上兩點就是這篇文章的內容,廢話很少話,正文請慢用。java

咱們都接觸 HashMap、ArrayList 這些集合類,這些在 java.util 包的集合類就都是快速失敗的;而 java.util.concurrent 包下的類都是安全失敗,好比:ConcurrentHashMap。安全

1. 快速失敗(fail-fast)

在使用迭代器對集合對象進行遍歷的時候,若是 A 線程正在對集合進行遍歷,此時 B 線程對集合進行修改(增長、刪除、修改),或者 A 線程在遍歷過程當中對集合進行修改,都會致使 A 線程拋出 ConcurrentModificationException 異常。微信

具體效果咱們看下代碼:併發

HashMap hashMap = new HashMap();
        hashMap.put("不僅Java-1", 1);
        hashMap.put("不僅Java-2", 2);
        hashMap.put("不僅Java-3", 3);

        Set set = hashMap.entrySet();
        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
            hashMap.put("下次循環會拋異常", 4);
            System.out.println("此時 hashMap 長度爲" + hashMap.size());
        }

執行後的效果以下圖:spa

爲何在用迭代器遍歷時,修改集合就會拋異常時?.net

緣由是迭代器在遍歷時直接訪問集合中的內容,而且在遍歷過程當中使用一個 modCount 變量。集合在被遍歷期間若是內容發生變化,就會改變 modCount 的值。線程

每當迭代器使用 hashNext()/next() 遍歷下一個元素以前,都會檢測 modCount 變量是否爲 expectedModCount 值,是的話就返回遍歷;不然拋出異常,終止遍歷。code

2. 安全失敗(fail-safe)

明白了什麼是快速失敗以後,安全失敗也是很是好理解的。對象

採用安全失敗機制的集合容器,在遍歷時不是直接在集合內容上訪問的,而是先複製原有集合內容,在拷貝的集合上進行遍歷。blog

因爲迭代時是對原集合的拷貝進行遍歷,因此在遍歷過程當中對原集合所做的修改並不能被迭代器檢測到,故不會拋 ConcurrentModificationException 異常

咱們上代碼看下是否是這樣

ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap();
        concurrentHashMap.put("不僅Java-1", 1);
        concurrentHashMap.put("不僅Java-2", 2);
        concurrentHashMap.put("不僅Java-3", 3);

        Set set = concurrentHashMap.entrySet();
        Iterator iterator = set.iterator();

        while (iterator.hasNext()) {
            System.out.println(iterator.next());
            concurrentHashMap.put("下次循環正常執行", 4);
        }
        System.out.println("程序結束");

運行效果以下,的確不會拋異常,程序正常執行。
<div align=center>

最後說明一下,快速失敗和安全失敗是對迭代器而言的。併發環境下建議使用 java.util.concurrent 包下的容器類,除非沒有修改操做。

我是七淅 (xī),後臺回覆「Java」,送你 13 本 Java 經典電子書。公衆號專一分享 Java 乾貨、讀書筆記、成長思考。

參考文章:
https://blog.csdn.net/qq_3178...

若是你喜歡本文,歡迎來微信公衆號「不僅Java」和我一塊兒學(wan)習(shua)。後臺回覆「Java」,送你 13 本 Java 經典電子書。公衆號專一分享 Java 乾貨、讀書筆記、成長思考
圖片描述

相關文章
相關標籤/搜索