Iterator의 Fail-Fast와 ConcurrentModificationException

jj J·2022년 12월 2일
1

JAVA

목록 보기
7/15
post-thumbnail

Collection을 공부하던 중 Fail-Fast라는 키워드가 나와서 이에 대해 깊이 있게 알아보고자 한다.

Fail-Fast는 오류가 발생하는 즉시 작업을 중단하고 오류를 알려 진행중인 작업을 중단한다.
반대되는 개념으로 Fail-Safe 라는 것이 있는데, 이는 오류가 발생해도 중단하지 않고 오류 발생을 최대한 피하려고 한다.

Fail-Fast Iterators

JAVA의 Collection은 modCount라는 내부 증감 횟수를 기록하기 위한 변수를 사용하는데, Collection에 item이 추가, 제거될때마다 이 변수의 값이 1씩 증가한다.

이후 iterating 중에 next 메서드를 호출 할때마다 현재 modCount 값을 초기의 값과 비교해 다르다면 ConcurrentModificationException을 throw하고 작업을 중단해버린다.

ArrayList, HashSet 같은 java.util 아래의 컬렉션들의 iterator는 모두 Fail-Fast 방식이 적용되어 있다.


해결 방법은 iterator 객체를 따로 만들어, 원본이 아닌 iterator 객체를 편집하면 된다.

iterable한 자료를 순환 중에 원본 편집해 버리면, 다음 순환 결과가 의도치 않은 값이 나올 수 있기 때문에, 맨 위와 같은 원본 편집 방식은 지양하고, 필요하면 iterator 객체를 얻어 사용하는 방식으로 구현을 해야한다.

profile
매일 발전

0개의 댓글