From c0f70b3753df24e3cf6bad49ba32588c8f675da7 Mon Sep 17 00:00:00 2001 From: siyeonSon Date: Sun, 10 Sep 2023 21:35:52 +0900 Subject: [PATCH] =?UTF-8?q?[Item76]:=20=EA=B0=80=EB=8A=A5=ED=95=9C=20?= =?UTF-8?q?=ED=95=9C=20=EC=8B=A4=ED=8C=A8=20=EC=9B=90=EC=9E=90=EC=A0=81?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=A7=8C=EB=93=A4=EB=9D=BC=20(#165)(?= =?UTF-8?q?=EC=8B=9C=EC=97=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4_\353\247\214\353\223\244\353\235\274.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 "Ch10/item76/\352\260\200\353\212\245\355\225\234_\355\225\234_\354\213\244\355\214\250_\354\233\220\354\213\234\354\240\201\354\234\274\353\241\234_\353\247\214\353\223\244\353\235\274.md" diff --git "a/Ch10/item76/\352\260\200\353\212\245\355\225\234_\355\225\234_\354\213\244\355\214\250_\354\233\220\354\213\234\354\240\201\354\234\274\353\241\234_\353\247\214\353\223\244\353\235\274.md" "b/Ch10/item76/\352\260\200\353\212\245\355\225\234_\355\225\234_\354\213\244\355\214\250_\354\233\220\354\213\234\354\240\201\354\234\274\353\241\234_\353\247\214\353\223\244\353\235\274.md" new file mode 100644 index 0000000..2ae3083 --- /dev/null +++ "b/Ch10/item76/\352\260\200\353\212\245\355\225\234_\355\225\234_\354\213\244\355\214\250_\354\233\220\354\213\234\354\240\201\354\234\274\353\241\234_\353\247\214\353\223\244\353\235\274.md" @@ -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에 대해서는 실패 원자적으로 만들려는 시도조차 할 필요가 없다 \ No newline at end of file