본문 바로가기
Study Note/Java

JAVA_ Fail-Safe Iterator vs Fail-Fast Iterator

by 시뮝 2019. 9. 9.
728x90

Fail-Safe Iterator vs Fail-Fast Iterator

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입니다.

 

Fail-Safe Iterators

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

즉, 반복되는 동안 Collection을 수정하면 Iterator가 보는 것이 보장되지 않습니다. 이 동작은 Collection마다 다를 수 있으며 각 Collection의 Javadoc에 문서화되어 있습니다.

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

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

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

 

 

참고사이트(EN) 1 : https://www.benchresources.net/various-ways-to-iterate-through-hashtable-in-java-6-ways/

참고사이트(EN) 2 : https://www.baeldung.com/java-fail-safe-vs-fail-fast-iterator

728x90

댓글