본문 바로가기
스터디/JAVA

[JAVA] Fail-Fast 와 Fail-Safe

by zoodi 2023. 8. 17.
728x90

목차

     

    1. Fail-Fast란

    Fail-Fast 는 동작중 오류가 발생하면 바로 오류를 알리고, 작업을 중단하는 것입니다.

    즉, 문제가 발생하면 곧바로 실행을 중단하고 최대한 빨리 예외를 던집니다.

    ArrayList, HashMap 등과 같은 java.util 패키지의 콜렉션에 대한 기본 반복자는 Fail-Fast입니다.

     

    Fail-Fast Iterators

    Iterator의 remove() 메소드 이외의 코드로 기존 Collection이 수정되면 Fail-Fast iterators는 예외가 발생합니다.Collections은 modCount라는 내부 카운터를 유지합니다. Collection에서 항목을 추가하거나 제거 할 때마다 이 카운터가 증가합니다.반복 할 때 각 next() 호출에서 modCount의 현재 값이 초기 값과 비교됩니다. 불일치가 있으면 전체 작업을 중단시키는 ConcurrentModificationException이 발생합니다.Collection을 반복하는 동안 Iterator의 remove() 메소드를 사용하여 항목을 제거하면 완전히 안전하며 예외가 발생하지 않습니다.하지만 Collection의 remove() 메소드를 사용하여 요소를 제거하면 예외가 발생합니다.

     

    2. Fail-Fast 예시 코드

     

    package com.test.dbtest;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Iterator;
    import java.util.concurrent.ConcurrentHashMap;
    
    public class test {
    
        public static void funcFailFast() {
            ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
            Iterator<Integer> iterator = numbers.iterator();
            while (iterator.hasNext()) {
                Integer number = iterator.next();
                numbers.add(50);
                System.out.println(number);
            }
        }
        
          public static void main(String[] args) {
            funcFailFast();
        }
    
    }

     

     

    3. Fail-Safe란

    Fail-Fast와는 반대로 동작중 오류가 발생해도 작업을 중단하지 않고 진행합니다. 따라서 가능한 한 많은 fail을 피하려고합니다.

    ConcurrentHashMap, CopyOnWriteArrayList 등과 같은 java.util.concurrent 패키지의 콜렉션에있는 반복자는 본질적으로 Fail-Safe입니다.

     

    Fail-Safe Iterators

    Fail-Safe Iterator는 실제 Collection의 복제본을 작성하고 반복합니다. 반복자가 작성된 후 수정이 발생해도 사본은 그대로 유지됩니다. 따라서 이 반복자는 기존 Collection을 수정하더라도 계속 반복됩니다. 즉, 반복되는 동안 Collection을 수정하면 Iterator가 보는 것이 보장되지 않습니다. 이 동작은 Collection마다 다를 수 있으며 각 Collection의 Javadoc에 문서화되어 있습니다.Fail-Safe Iterators 단점은 Iterator가 실제 Collection 대신 복제본에서 작업하고 있기 때문에 Collection에서 업데이트 된 최신 데이터를 리턴하지 않습니다.

     

     

    4. Fail-Safe 예시 코드

    package com.test.dbtest;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Iterator;
    import java.util.concurrent.ConcurrentHashMap;
    
    public class test {
    
        public static void funcFailSafe() {
            ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
            map.put("First", 10);
            map.put("Second", 20);
            map.put("Third", 30);
            map.put("Fourth", 40);
            Iterator<String> iterator = map.keySet().iterator();
            while (iterator.hasNext()) {
                String key = iterator.next();
                map.put(key, 50);
                System.out.println("key: " + key);
            }
        }
    
        public static void main(String[] args) {
            funcFailSafe();
        }
    
    }

     

    참고

    https://www.baeldung.com/java-fail-safe-vs-fail-fast-iterator

    https://velog.io/@bey1548/Fail-Fast-%EB%B0%A9%EC%8B%9D%EA%B3%BC-Fail-Safe-%EB%B0%A9%EC%8B%9D%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90

    728x90

    댓글