fast-fail iterator는 무엇이고 어떤 것을 위해 사용되는 건가요

kkambbak1·2024년 1월 23일
0

자바에서는 Iterator를 사용한 for 문 순환 중 데이터가 변경되었을때

Fail-Fast systems은 에러를 발생시키며 작업을 중단한다.

반면 Fail-Safe systems은 장애 발생시 작업을 중단하지 않는다.

Fail-Fast Iterators

Iterator의 remove() 메소드 이외의 코드로 기존 Collection이 수정되면 Fail-fast iterators는 예외가 발생합니다.

Collection은 modCount라는 내부 카운터를 유지합니다. Collection에서 항목을 추가하거나 제거 할 때마다 이 카운터가 증가합니다.

반복 할 때 각 next() 호출에서 modCount의 현재 값이 초기 값과 비교됩니다. 불일치가 있으면 전체 작업을 중단시키는 ConcurrentModificationException이 발생합니다.
Collection을 반복하는 동안 Iterator의 remove() 메소드를 사용하여 항목을 제거하면 완전히 안전하며 예외가 발생하지 않습니다.

그러나 Collection의 remove() 메소드를 사용하여 요소를 제거하면 예외가 발생합니다.

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

However, if the Collection‘s remove() method is used for removing an element, it throws an exception:

ArrayList<Integer> numbers = // ...

Iterator<Integer> iterator = numbers.iterator();
while (iterator.hasNext()) {
    if (iterator.next() == 30) {
        iterator.remove(); // ok!
    }
}

iterator = numbers.iterator();
while (iterator.hasNext()) {
    if (iterator.next() == 40) {
        numbers.remove(2); // exception
    }
}
왜 컬렉션은 Fail-Fast 전략을 사용할까요?

Fail-Fast는 문제를 감지하는 즉시 예외를 던집니다.
미래에 예측 불가능한 의도하지 않은 문제가 발생하는 것을 원천적으로 차단하기 위해서.

Fail-Safe Iterators

Fail-Safe Iterator는 실제 Collection의 복제본을 작성하고 반복합니다. 반복자가 작성된 후 수정이 발생해도 사본은 그대로 유지됩니다. 따라서 이 반복자는 기존 Collection을 수정하더라도 계속 반복됩니다. 

한 가지 단점은 Iterator가 실제 콜렉션 대신 복제본에서 작업하고 있기 때문에 콜렉션에서 업데이트 된 데이터를 반환하지 않는다는 것입니다.

또 다른 단점은 시간과 메모리와 관련하여 콜렉션의 사본을 작성하는 오버 헤드입니다.

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

Iterators on Collections from java.util.concurrent package such as ConcurrentHashMapCopyOnWriteArrayList, etc. are Fail-Safe in nature.

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("Fifth", 50);
}

출처: https://simuing.tistory.com/entry/JAVA-Fail-Safe-Iterator-vs-Fail-Fast-Iterator [시뮝 연구소:티스토리]

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

profile
윤성

1개의 댓글

comment-user-thumbnail
2025년 1월 28일

좋은 글 감사합니다~

답글 달기