Item76. 가능한 한 실패 원자적으로 만들라

실패 원자성 (failure atomic)

  • 호출된 method가 실패하더라도 해당 객체는 method 호출 전 상태를 유지하면 호출자가 오류 상태를 복구할 수 있다. 이런 특성을 실패 원자적(failure-atomic)이라고한다.

method를 실패 원자적으로 만드는 방법

  1. 불변 객체로 설계 : 불변 객체는 생성 시점에 상태가 고정된다

  2. 가변 객체의 경우 method 실행전에 매개변수의 유효성을 검사한다. 객체 내부 상태를 변경하기전에 잠재적 예외 가능성을 대부분 걸러낼 수 있는 방법이다.

1
2
3
4
5
6
7
8
9
10

public Object pop(){
// 유효성검사
if(size == 0 ){
throw new EmptyStackException();
}
Object result = elements[--size];
elements[size]=null; // 다 쓴 참조 해제
return result;
}

이와 비슷하게 실패할 가능성이 있는 모든 코드를 객체의 상태를 바꾸는 코드보다 앞에 배치하는 방법도 있다.

예를 들면 TreeMap class 는 원소들을 특정 기준으로 정렬할 수 있으며 기본적으로 원소 객체들이 정렬 가능한 타입이여야 한다. 따라서 TreeMap class를 변경하기 전에 해당 원소가 들어갈 위치를 찾는과정에서 ClassCastException이 터진다.

  1. 객체의 임시 복사본에서 작업을 수행한 다음, 작업이 성공적으로 완료되면 원래 객체와 교체하는 방법

예를 들면 정렬 method에서 정렬을 수행하기 전에 입력 리스트를 임시배열로 옮겨 담는다. 혹시나 정렬이 실패하더라도 입력 리스트 자체는 변경되지 않는다.

  1. 작업 도중 발생하는 실패를 가로채는 복구 코드를 작성해 작업 전 상태로 되돌리는 방법

주의사항

  • 실패 원자성은 멀티 쓰레드 상황에서 항상 보장되진 않는다. ConcurrentMuodificationException을 잡아서 처리했다고해서 객체가 여전히 쓸 수 있는 상태라고 가정해서는 안된다.

  • 실패 원자성을 보장하기 위해 비용이 많이 드는 경우가 있기 때문에 항상 실패 원자성을 보장해야 하는 것은 아니다.

Comments