티스토리 뷰
실패 원자적
- 일반화 해서 말하자면 호출된 메서드가 실패 하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다.
메서드를 원자적으로 만드는 방법
불변 객체
- 가장 간단한 방법은 불변객체로 설계하는 방법이다.
- 메서드가 실패하면 새로운 객체가 만들어지지 않을 수 있으나, 기존 객체가 불안정한 상태에 빠질 일은 결코 없다.
- 불변객체의 상태는 생성 시점에 고정되어 절대 변하지 않기 때문이다.
매개변수 유효성 검사
public Object pop() {
if(size == 0){
throw new EmptyStackException();
}
Object result = elements[--size];
elements[size] = null // 다쓴 참조 해제
return result;
}
임시 복사본 사용
- 객체의 임시 복사본에서 작업을 수행한 다음, 작업이 성공적으로 완료되면 원래 객체와 교체
- 데이터를 임시 자료구조에 저장해 작업하는게 더 빠를 때 적용하기 좋은 방식이다
- 예를 들어 정렬 메서드에서 정렬을 수행하기 전에 입력 리스트의 원소들을 배열로 옮겨 담는다. 배열을 사용하면 정렬 알고리즘의 반복문에서 원소들에 훨씬 빠르게 접근할 수 있기 때문이다.
- 성능을 높여 줄 뿐만 아니라 , 혹시나 정렬에 실패하더라도 입력 리스트는 변하지 않는 효과를 얻을 수 있다.
복구 코드 작성
- 작업 도중 발생하는 실패를 가로채는 복구코드 작성하여 작업 전 상태로 되돌린다
- 주로 디스크 기반의 내구성을 보장해야 하는 자료구조에 쓰이지만 자주 쓰이지는 않는다.
예외
- 실패 원자성을 항상 만족시킬 수는 없다.
- 예를 들어 두 스레드가 동기화 없이 같은 객체를 동시에 수정한다면 그 객체의 일관성이 깨질 수 있다.
- 또한 Error는 복구할 수 없으므로 AssertionError에 대해서는 실패 원자적으로 만들려는 시도조차 할 필요가 없다.
'Java' 카테고리의 다른 글
[Effective Java] 예외의 상세 메시지에 실패 관련 정보를 담으라 (0) | 2021.08.07 |
---|---|
[Effective Java] 메서드가 던지는 모든 예외를 문서화하라 (0) | 2021.08.07 |
[Effective Java] 추상화 수준에 맞는 예외를 던지라 (0) | 2021.08.07 |
[Effective Java] 표준 예외를 사용하라 (0) | 2021.08.04 |
[Effective Java] 필요 없는 검사 예외 사용은 피하라 (0) | 2021.08.04 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Today
- Yesterday
링크
TAG
- Observer Pattern
- Serialize
- reactive stream
- 부하테스트
- JMeter
- Java
- template method
- jdk11
- observable
- in-memory
- exception
- Concurrecy
- gslb
- jvm
- nosql
- Effective JAVA
- 메인보드#asrock b650m #조립pc #후기이벤트
- iterable
- strategy
- Spring
- Redis
- reactive
- concurrency
- 디자인패턴
- 영속성
- LAMBDA
- Design Pattern
- Serializable
- template
- object
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함