forked from depromeet/effective-java-study
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Item76]: 가능한 한 실패 원자적으로 만들라 (depromeet#165)(시연)
- Loading branch information
Showing
1 changed file
with
39 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
# item76. 가능한 한 실패 원자적으로 만들라 | ||
- 실패 원자적(failure-atomic): 호출된 메서드가 실패 하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다 | ||
|
||
## 메서드를 원자적으로 만드는 방법 | ||
### 1. 불변 객체 | ||
- [item 17 참고](https://github.com/depromeet/effective-java-study/blob/main/Ch04/item17/%EB%B3%80%EA%B2%BD_%EA%B0%80%EB%8A%A5%EC%84%B1%EC%9D%84_%EC%B5%9C%EC%86%8C%ED%99%94%ED%95%98%EB%9D%BC.md) | ||
- 불변객체의 상태는 생성 시점에 고정되어 절대 변하지 않는다 | ||
- 따라서 메서드가 실패하면 새로운 객체가 만들어지지 않을 수 있고, 기존 객체가 불안정한 상태에 빠질 일은 결코 없다 | ||
|
||
### 2. 매개변수 유효성 검사 | ||
- [item 49 참고](https://github.com/depromeet/effective-java-study/blob/main/Ch08/item49/%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EA%B0%80_%EC%9C%A0%ED%9A%A8%ED%95%9C%EC%A7%80_%EA%B2%80%EC%82%AC%ED%95%98%EB%9D%BC.md) | ||
- 객체의 내부 상태를 변경하기 전에 잠재적 예외 가능성을 걸러준다 | ||
```java | ||
public Object pop() { | ||
if(size == 0){ | ||
throw new EmptyStackException(); | ||
} | ||
Object result = elements[--size]; | ||
elements[size] = null; // 다 쓴 참조 해제 | ||
return result; | ||
} | ||
``` | ||
|
||
### 3. 임시 복사본 사용 | ||
- 객체의 임시 복사본에서 작업 수행 -> 완료 -> 원래 객체와 교체 | ||
- 데이터를 임시 자료구조에 저장해 작업하는 게 더 빠를 때 적용하기 좋다 | ||
- 예: 입력 리스트를 정렬할 때 | ||
- 정렬 메서드에서 정렬을 수행하기 전에 입력 리스트의 원소들을 배열로 옮겨 담는다. 배열을 사용하면 정렬 알고리즘의 반복문에서 원소들에 훨씬 빠르게 접근할 수 있기 때문이다 | ||
- 성능을 높여 줄 뿐만 아니라, 정렬에 실패하더라도 입력 리스트는 변하지 않는 효과를 얻을 수 있다 | ||
|
||
### 4. 복구 코드 작성 | ||
- 작업 도중 발생하는 실패를 가로채는 복구코드 작성하여 작업 전 상태로 되돌린다 | ||
- 디스크 기반의 내구성을 보장해야 하는 자료구조에 쓰인다 | ||
- 자주 쓰이지는 않는다 | ||
|
||
### 예외 | ||
- 실패 원자성을 항상 만족시킬 수는 없다 | ||
- 예를 들어 두 스레드가 동기화 없이 같은 객체를 동시에 수정한다면 그 객체의 일관성이 깨질 수 있다 | ||
- Error는 복구할 수 없으므로 AssertionError에 대해서는 실패 원자적으로 만들려는 시도조차 할 필요가 없다 |