Skip to content

Commit

Permalink
GITBOOK-221: item 79 : 과도한 동기화는 피하라 - 그림 삽입
Browse files Browse the repository at this point in the history
  • Loading branch information
GoldenPearls authored and gitbook-bot committed Dec 11, 2024
1 parent e1fc090 commit 2a06a2e
Show file tree
Hide file tree
Showing 8 changed files with 14 additions and 0 deletions.
Binary file added developLog/.gitbook/assets/image (86).png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added developLog/.gitbook/assets/image (87).png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added developLog/.gitbook/assets/image (88).png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added developLog/.gitbook/assets/image (89).png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added developLog/.gitbook/assets/image (90).png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added developLog/.gitbook/assets/image (91).png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added developLog/.gitbook/assets/image (92).png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 14 additions & 0 deletions developLog/programming-lanuage/java/effective-java/11/item-79.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,17 @@

### 1) 동기화된 영역 내부에서 피해야 할 행동 (외계인 메서드)

<figure><img src="../../../../.gitbook/assets/image (86).png" alt=""><figcaption></figcaption></figure>

1. **재정의 가능한 메서드 호출 금지**
2. **클라이언트가 제공한 함수 객체 호출 금지** (예: `아이템 24`)

이러한 메서드들은 `외계인 메서드(alien method)`라고 부른다. 외계인 메서드는 어떤 동작을 수행할지 예측할 수 없고, 통제도 불가능하다. 동기화된 영역에서 외계인 메서드를 호출하면 다음과 같은 문제가 발생할 수 있다

### 2) 동기화 된 영역에서 외계인 메서드 호출 시 발생하는 문제

<figure><img src="../../../../.gitbook/assets/image (87).png" alt=""><figcaption></figcaption></figure>

1. 예외 발생

* 동기화된 영역에서 외계인 메서드를 호출하면 예기치 않은 상태가 발생하거나 예상치 못한 예외가 발생할 수 있다. 이는 프로그램의 안정성을 심각하게 위협할 수 있다.
Expand All @@ -37,6 +41,8 @@

### 3) 잘못된 코드 예제: 외계인 메서드를 호출하는 경우

<figure><img src="../../../../.gitbook/assets/image (88).png" alt=""><figcaption></figcaption></figure>

다음은 `집합(Set)`을 감싸는 래퍼 클래스이다. 이 클래스는 관찰자 패턴을 사용하여 집합에 원소가 추가될 때 알림을 보낸다. 이 예제는 잘못된 방식으로 동기화된 영역 내부에서 외계인 메서드를 호출하는 상황을 보여준다.

```java
Expand Down Expand Up @@ -128,6 +134,8 @@ for (int i = 0; i < 100; i++) {

### 개선 방법 1: 동기화 블록 밖으로 외계인 메서드 이동

<figure><img src="../../../../.gitbook/assets/image (89).png" alt=""><figcaption></figcaption></figure>

외계인 메서드를 호출하기 전에 관찰자 리스트를 복사하여 동기화 블록 밖에서 순회하도록 수정하면 문제가 해결된다.

```java
Expand Down Expand Up @@ -196,6 +204,8 @@ public class ObservableSet<E> extends ForwardingSet<E> {

#### CopyOnWriteArrayList의 장점

<figure><img src="../../../../.gitbook/assets/image (90).png" alt=""><figcaption></figcaption></figure>

* **동기화 필요 없음**: 읽기 작업은 동기화 없이 안전하게 수행된다.
* **코드 단순화**: 리스트 복사를 제거하여 코드가 더 간결해진다.
* **안전한 수정**: 수정 작업이 복사본에서 이루어지기 때문에 동기화 문제가 발생하지 않는다.
Expand All @@ -214,6 +224,8 @@ public class ObservableSet<E> extends ForwardingSet<E> {

### 📚 핵심 정리

<figure><img src="../../../../.gitbook/assets/image (91).png" alt=""><figcaption></figcaption></figure>

교착상태와 데이터 손상을 방지하려면 동기화 블록 내부에서 외계인 메서드를 호출하지 말아야 한다. 이를 위해 다음 지침을 따른다:

1. **동기화 블록 내부 작업 최소화**:
Expand All @@ -227,6 +239,8 @@ public class ObservableSet<E> extends ForwardingSet<E> {

**부록: CopyOnWriteArrayList와 ArrayList 비교**

<figure><img src="../../../../.gitbook/assets/image (92).png" alt=""><figcaption></figcaption></figure>

| 특징 | CopyOnWriteArrayList | ArrayList |
| ---------- | -------------------- | ------------- |
| 쓰기 작업 중 동작 | 새로운 복사본 생성 | 기존 리스트 수정 |
Expand Down

0 comments on commit 2a06a2e

Please sign in to comment.