Fail Fast與Fail Safe的區別

Fail Fast

Fail Fast Iterator在遍歷集合時,若該集合發生了結構性的改變,則將拋出 ConcurrentModification 異常。例如:

        Map<String, String> premiumPhone = new HashMap<String, String>();
        premiumPhone.put("Apple", "iPhone");
        premiumPhone.put("HTC", "HTC one");
        premiumPhone.put("Samsung", "S5");

        Iterator<String> iterator = premiumPhone.keySet().iterator();

        while (iterator.hasNext()) {
            System.out.println(premiumPhone.get(iterator.next()));
            premiumPhone.put("Sony", "Xperia Z");
        }

如果將while循環內的語句

premiumPhone.put("Sony", "Xperia Z");

改成如下,則不會拋出ConcurrentModification 異常。因爲只修改了值,沒有改變集合的結構

premiumPhone.put("HTC", "Xperia Z");

Fail Fast檢測集合結構改變的原理,Iterator直接訪問集合的數據結構,它保留一個標誌”mods”,在Iterator每次調用hasNext()或者是next()方法時,首先檢測”mods”狀態,如果結構已經改變,則拋出異常。

Fail Safe

Fail Safe Iterator的實現原理是,先將原集合拷貝一份,在拷貝上開展遍歷,因此不會引起ConcurrentModification 異常。因此,Fail Safe Iterator存在兩個缺陷:
1. 引入了額外的空間開銷
2. 遍歷時讀取的數據,並不能保證是最新的

一個Fail Safe Iterator的例子如下:

        ConcurrentHashMap<String, String> premiumPhone = new ConcurrentHashMap<String, String>();
        premiumPhone.put("Apple", "iPhone");
        premiumPhone.put("HTC", "HTC one");
        premiumPhone.put("Samsung", "S5");

        Iterator<String> iterator = premiumPhone.keySet().iterator();

        while (iterator.hasNext()) {
            System.out.println(premiumPhone.get(iterator.next()));
            premiumPhone.put("Sony", "Xperia Z");
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章