diff --git a/developLog/.gitbook/assets/image (86).png b/developLog/.gitbook/assets/image (86).png new file mode 100644 index 0000000..766a4eb Binary files /dev/null and b/developLog/.gitbook/assets/image (86).png differ diff --git a/developLog/.gitbook/assets/image (87).png b/developLog/.gitbook/assets/image (87).png new file mode 100644 index 0000000..3cb5c37 Binary files /dev/null and b/developLog/.gitbook/assets/image (87).png differ diff --git a/developLog/.gitbook/assets/image (88).png b/developLog/.gitbook/assets/image (88).png new file mode 100644 index 0000000..91eae88 Binary files /dev/null and b/developLog/.gitbook/assets/image (88).png differ diff --git a/developLog/.gitbook/assets/image (89).png b/developLog/.gitbook/assets/image (89).png new file mode 100644 index 0000000..24de061 Binary files /dev/null and b/developLog/.gitbook/assets/image (89).png differ diff --git a/developLog/.gitbook/assets/image (90).png b/developLog/.gitbook/assets/image (90).png new file mode 100644 index 0000000..6b003f8 Binary files /dev/null and b/developLog/.gitbook/assets/image (90).png differ diff --git a/developLog/.gitbook/assets/image (91).png b/developLog/.gitbook/assets/image (91).png new file mode 100644 index 0000000..5efb307 Binary files /dev/null and b/developLog/.gitbook/assets/image (91).png differ diff --git a/developLog/.gitbook/assets/image (92).png b/developLog/.gitbook/assets/image (92).png new file mode 100644 index 0000000..03ce282 Binary files /dev/null and b/developLog/.gitbook/assets/image (92).png differ diff --git a/developLog/programming-lanuage/java/effective-java/11/item-79.md b/developLog/programming-lanuage/java/effective-java/11/item-79.md index d37fb97..2e3de72 100644 --- a/developLog/programming-lanuage/java/effective-java/11/item-79.md +++ b/developLog/programming-lanuage/java/effective-java/11/item-79.md @@ -8,6 +8,8 @@ ### 1) 동기화된 영역 내부에서 피해야 할 행동 (외계인 메서드) +
+ 1. **재정의 가능한 메서드 호출 금지** 2. **클라이언트가 제공한 함수 객체 호출 금지** (예: `아이템 24`) @@ -15,6 +17,8 @@ ### 2) 동기화 된 영역에서 외계인 메서드 호출 시 발생하는 문제 +
+ 1. 예외 발생 * 동기화된 영역에서 외계인 메서드를 호출하면 예기치 않은 상태가 발생하거나 예상치 못한 예외가 발생할 수 있다. 이는 프로그램의 안정성을 심각하게 위협할 수 있다. @@ -37,6 +41,8 @@ ### 3) 잘못된 코드 예제: 외계인 메서드를 호출하는 경우 +
+ 다음은 `집합(Set)`을 감싸는 래퍼 클래스이다. 이 클래스는 관찰자 패턴을 사용하여 집합에 원소가 추가될 때 알림을 보낸다. 이 예제는 잘못된 방식으로 동기화된 영역 내부에서 외계인 메서드를 호출하는 상황을 보여준다. ```java @@ -128,6 +134,8 @@ for (int i = 0; i < 100; i++) { ### 개선 방법 1: 동기화 블록 밖으로 외계인 메서드 이동 +
+ 외계인 메서드를 호출하기 전에 관찰자 리스트를 복사하여 동기화 블록 밖에서 순회하도록 수정하면 문제가 해결된다. ```java @@ -196,6 +204,8 @@ public class ObservableSet extends ForwardingSet { #### CopyOnWriteArrayList의 장점 +
+ * **동기화 필요 없음**: 읽기 작업은 동기화 없이 안전하게 수행된다. * **코드 단순화**: 리스트 복사를 제거하여 코드가 더 간결해진다. * **안전한 수정**: 수정 작업이 복사본에서 이루어지기 때문에 동기화 문제가 발생하지 않는다. @@ -214,6 +224,8 @@ public class ObservableSet extends ForwardingSet { ### 📚 핵심 정리 +
+ 교착상태와 데이터 손상을 방지하려면 동기화 블록 내부에서 외계인 메서드를 호출하지 말아야 한다. 이를 위해 다음 지침을 따른다: 1. **동기화 블록 내부 작업 최소화**: @@ -227,6 +239,8 @@ public class ObservableSet extends ForwardingSet { **부록: CopyOnWriteArrayList와 ArrayList 비교** +
+ | 특징 | CopyOnWriteArrayList | ArrayList | | ---------- | -------------------- | ------------- | | 쓰기 작업 중 동작 | 새로운 복사본 생성 | 기존 리스트 수정 |