실패 원자적인 특성은 무엇일까? "호출된 메서드가 실패하더라도 해당 객체가 메서드 호출 전 상태를 유지하는 것"을 말한다. 즉, 예외가 발생하더라도 객체 상태가 메서드 호출 전과 똑같이 유지돼야 한다는 것이다.
- 불변 객체는 태생적으로 실패 원자적이다.
- 불변 객체의 상태는 생성 시점에 고정되어 절대 변하지 않기 때문
- 작업 수행에 앞서 매개변수의 유효성을 검사할 수 있다.
- 객체 내부 상태를 변경하기 전에, 잠재적 예외의 가능성 대부분을 걸러낼 수 있다.
- 계산 이전에는 인수의 유효성을 검사할 수 없는 경우(즉, 2번을 바로 적용하기 어려운 경우), 2번 방식 이전에 사용할 수 있다.
- ex.
TreeMap에서 기준에 따라 비교할 수 있는 타입인지 아닌지가 중요한데, 이상한 원소를TreeMap에 추가하려고 하면ClassCastException을 던지며TreeMap내부 상태를 바꾸지 못하게 막는다.
- 방어적 복사를 수행하여 작업이 성공적인 경우에만 기존 객체와 교체한다.
- ex. 어떤 정렬 메서드는 접근 속도를 높이기 위해
List안의 원소들을 복사해서 배열로 옮겨담고, 나중에 다시List반환하기도 함- 혹시나 정렬에 실패하더라도 기존 리스트는 변하지 않는다.
- 작업 도중에 실패가 발생하면 그 실패를 가로채서 복구 코드를 실행하게 만든다.
- 즉, 복구 코드를 실행하여 작업 이전 상태로 되돌리는 방법이다.
- 자주 쓰이는 방법은 아니다.
- 여러 스레드가 동시 접근할 때, 적절한 동기화가 없다면 객체 일관성이 깨질 수 있다.(실패 원자성 달성 불가)
- 실패 원자성을 항상 달성해야하는 것도 아니다.
- 실패 원자성을 달성하기 위해 드는 비용이나 복잡도가 너무 크다면 오히려 손해