#64 실패 원자성을 갖도록 노력하자
실패 원자성(failure atomic)이란, 호출된 메서드가 실패하더라도 객체 상태는 메서드 호출 전과 같아야 하는 특성을 말합니다.
실패 원자성을 갖기 위한 몇 가지 방법에 대해 알아보겠습니다.
불변 객체는 실패 원자성과 아무런 관련이 없습니다.
실행이 실패해도 기존 객체의 상태가 바뀌지 않기 때문입니다.
객체의 상태가 변경되기 전에 미리 유효성을 검사해 예외를 던질 수 있습니다.
만약 유효성을 검사하는 코드 없이, 빈 Object[] 배열에서 요소 하나를 꺼내려고 한다면 예외가 발행한 후에 size의 값이 1 감소된 상태가 될 것입니다.
즉, 실패 원자성을 가지지 못한 채, 다음 호출에서도 계속 실패하게 됩니다.
객체를 변경하는 코드 부분에 앞서 실패할 수 있는 코드 부분이 먼저 실행되도록 연산 순서를 조정합니다.
TreeMap에 요소를 추가하려면, 요소 타입이 Integer 타입이어야 합니다.
만약 String 같은 다른 타입을 추가하려면 ClassCastException 예외가 발생합니다.
따라서 요소를 추가하기 전에 적합한 타입인지 먼저 검사를 하도록 순서를 조정하면 됩니다.
흔하지 않지만 연산 도중에 발생하는 실패를 가로채는 복구 코드를 작성합니다.
주로 영속성(디스크 기반의)을 갖는 데이터 구조에 사용됩니다.
임시 복사본을 만들어 연산을 수행하고, 연산이 끝나면 객체의 내용을 임시 복사본 내용으로 변경합니다.
실패 원자성은 바람직 하지만, 항상 적용할 순 없습니다.
에러(Error)는 대체로 복구 불가능하기 때문에 실패 원자성 유지 불필요
멀티 스레드 환경에서 동기화 문제가 발생할 수 있음
만약 실패 원자성을 유지할 수 없는 상황이라면 API 문서에 이에 대해 분명하게 작성해 두어야 합니다.