fail fast , fail safe iterators


Fail Fast , Fail Safe ?


Javaには集合フレームワークの1つである奇形腫(重複者)が存在する.
Javaコレクションは、2つのタイプの歪みをサポートします.
それがFail Fast、Fail Safeです.
これらの奇形は例外の処理に役立つ.
フェイルオーバクイックタイヤは、フェイルオーバ時に動作を停止し、動作全体を停止します.
一方、フェイルオーバードライブは、障害が発生した場合に動作を停止しません.に代わる
失敗を極力避ける.

Fail Fast iterator

public class FailFastEx {

    public static void main(String[] args) {
        Map<String, String> addName = new HashMap<>();
        addName.put("이영진", "서초구");
        addName.put("유정현", "강남구");

        Iterator iterator = addName.keySet().iterator();
        while (iterator.hasNext()) {
            System.out.println(addName.get(iterator.next()));
            addName.put("오영근", "광진구"); 
            // 원본 컬렉션 반복 순회도중 컬렉션의 요소 변경됨 
        }
    }
}

Fail Fast Iteratorでは、コレクションを巡回するときにコレクションが変更されると、ConcurrentModificationExceptionが失われることがわかります.

どうして可能なの



Fail Fast Iteratorは内部にmodcountという値を使用してコレクションの構造が変更されているかどうかを確認できるデバイスを提供しています.値が変化した場合、例外が放出されます.

Fail Safe iterator


Fail Safe Iteratorは、元のオブジェクトではなくコレクションのコピーで演算する性質を持っています.したがって,集合の巡回中に変更が発生しても例外は投げ出されない.
コレクションの構造が変更されても、元のオブジェクトには影響しません.したがって,元の集合は構造的に一定に保たれる.

public class FailSafeEx {

    public static void main(String[] args) {
        
        CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<Integer>(new Integer[]{1,2,3,4});
        Iterator itr = list.iterator();
        while (itr.hasNext()) {
            list.add(30); //30을 추가하는데 30은 출력되지않음 
            Integer i = (Integer) itr.next();
            System.out.println(i);
        }
    }
}

上記の例では、コレクションのコピーを作成し、繰り返しを実行します.
レプリカを作成すると、より多くのメモリが必要になり、コレクションの重複操作とコレクションの変更操作を同時に実行できます.

整理する


Fail Fastには、HaspMap、ArrayList、Vector、Hashsetがあります.
コレクションの巡回中にコレクションの変更が発生した場合、例外が放出されます.
障害保護に比べて速度が速く、メモリ要件も小さい.
Fail Safeは、コレクションのコピーを使用して要素を巡回します.
Fail Fastよりも速度が遅く、より多くのメモリが必要ですが、重複中にコピーオブジェクトで変更できます(同時に動作するメリット).
ConcurrentHashMap、CopyOnWriteArrayListなどはFail Safe奇形に属する.
Reference: https://www.javatpoint.com/fail-fast-and-fail-safe-iterator-in-java