Iterator

1 minute read

Iterator

211126160630.png

새삼,, Scanner에서 사용하던 next, hasNext 메소드가 Iterator Interface를 구현한 것이었다.

Iterator는 Java Collection Framework의 일부이다. Java Collection을 순회하여 요소를 하나씩 검사할 때 사용된다.

Multi Thread 환경에서 Iterator

하나의 Thread(Task)가 Object를 실행(run)하는 동안 다른 Thread가 같은 Object를 수정하는 프로세스를 Concurrent modification라고 한다. collection의 요소를 추가, 삭제, 수정하여 구조가 변경될 수 있다. Iterator의 구현에 따라 Concurrent modification을 지원할 수도, ConcurrentModificationException을 발생시킬 수도 있다.

Fail Fast System에서 Fail Fast 방식의 Iterator

Fail Fast System은 오류 발생(Fail) 즉시 전체 작업을 중단하고 종료되는 시스템이다.

Fail Fast 방식의 Iterator는 iteration process 동안 컬렉션의 수정이 발생하면 즉시 ConcurrentModificationException을 발생시킨다.

내부적으로 modCount 라는 flag값을 사용하여 컬렉션의 수정여부를 파악한다.

즉, Fail Fase Iterator는 원본 컬렉션을 사용한다. 그러므로 장점은 추가 메모리가 필요하지 않다는 것이다.

ex.ArrayList, HashMap

Fail Safe System에서 Fail Safe 방식의 Iterator(non-Fail fast iterator)

Fail Safe System은 오류나 Fail이 발생해도 계속 작동하는 시스템이다. 작업을 즉시 중단하지 않는다. 오류를 숨기려하고 가능한 실패를 피하려고 노력한다. (they will try to hide the errors and will try to avoid failures as much as possible.)

Fail Safe 방식의 Iterator는 iteration process 동안 컬렉션이 수정되어도 Exception을 던지지 않는다.

즉, Fail Safe Iterator는 객체의 원본이 아니라 복사본을 사용한다. 그러므로 원본 컬렉션은 변경되지 않고, 복사본에 영향을 주기 때문에 thread-safe 하다.

Java SE documentation에 Fail Safe라는 단어가 사용되지는 않고, non-Fail fast iterator라고 한다.

ex.CopyOnWriteArrayList,CopyOnWriteArraySet

예를 들어, Fail Safe를 위해서는 ArrayList 대신 java.util.concurrent 패키지에 CopyOnWriteArrayList 클래스를 사용할 수 있다.

211126164646.png

A thread-safe variant of ArrayList in which all mutative operations (add, set, and so on) are implemented by making a fresh copy of the underlying array.

기본 배열의 복사본을 만들어 사용하므로 thread-safe 하다고 설명하고 있다.

Reference

  • https://docs.oracle.com/javase/8/docs/api/
  • https://www.javatpoint.com/fail-fast-and-fail-safe-iterator-in-java