Skip to content

Commit

Permalink
Update 79_과도한 동기화는 피하라_김형준.md
Browse files Browse the repository at this point in the history
  • Loading branch information
Flamme1004K authored Jul 26, 2021
1 parent da8fbbc commit 92ca67a
Showing 1 changed file with 24 additions and 1 deletion.
25 changes: 24 additions & 1 deletion 11장/79_과도한 동기화는 피하라_김형준.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,30 @@

notifyElementAdded 메서드에서 수행하는 순회는 동기화 블록 안에 있으므로 동시 수정이 일어나지 않도록 보장하지만 정작 자신이 콜백을 거쳐 되돌아와 수정하는 것까지 막지는 못한다고 한다.

---

set.addObserver(new SetObserver<> {
public void added(ObservableSet<Integer> s, Integer e) {
System.out.println(e);
if (e == 23) {
ExecutorService exec = Excutors.newSingleThreadExcutor();
try (
exec.submit(() -> s.removeObserver(this)).get();
} catch (ExcutionException | InterruptedException ex) {
throw new AssertionError(ex);
} finally {
exec.shutdown();
}
}
}
}

해당 예제에서는
1. 백그라운드 스레드가 s.removeObserver를 호출하면 관찰자를 잠그려 시도하지만 락을 얻을 수 없다고 한다. 바로 메인 스레드가 이미 락을 쥐고 있기 때문이라고 한다.
2. 하지만 여기서, 그와 동시에 메인 스레드는 백그라운드 스레드가 관찰자를 제거하기만 기다리기 때문에 교착 상태가 일어난다고 한다.

---

어떻게 리팩토링을 해야할까?

바로
Expand Down Expand Up @@ -145,4 +169,3 @@ StringBuffer 인스턴스는 거의 항상 단일 쓰레드에서 쓰였음에
- 멀티코어 세상인 지금은 과도한 동기화를 피하는 게 과거 어느 때보다 중요하다.

- 합당한 이유가 있을 때만 내부에서 동기화하고, 동기화했는지 여부를 문서에 명확히 밝히자.

0 comments on commit 92ca67a

Please sign in to comment.