From 92ca67ab53d9f1b6d621aa8a6e27f3e662456b69 Mon Sep 17 00:00:00 2001 From: Flamme1004K <50702723+Flamme1004K@users.noreply.github.com> Date: Mon, 26 Jul 2021 20:48:10 +0900 Subject: [PATCH] =?UTF-8?q?Update=2079=5F=EA=B3=BC=EB=8F=84=ED=95=9C=20?= =?UTF-8?q?=EB=8F=99=EA=B8=B0=ED=99=94=EB=8A=94=20=ED=94=BC=ED=95=98?= =?UTF-8?q?=EB=9D=BC=5F=EA=B9=80=ED=98=95=EC=A4=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4_\352\271\200\355\230\225\354\244\200.md" | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git "a/11\354\236\245/79_\352\263\274\353\217\204\355\225\234 \353\217\231\352\270\260\355\231\224\353\212\224 \355\224\274\355\225\230\353\235\274_\352\271\200\355\230\225\354\244\200.md" "b/11\354\236\245/79_\352\263\274\353\217\204\355\225\234 \353\217\231\352\270\260\355\231\224\353\212\224 \355\224\274\355\225\230\353\235\274_\352\271\200\355\230\225\354\244\200.md" index 3291af3..0c7a06d 100644 --- "a/11\354\236\245/79_\352\263\274\353\217\204\355\225\234 \353\217\231\352\270\260\355\231\224\353\212\224 \355\224\274\355\225\230\353\235\274_\352\271\200\355\230\225\354\244\200.md" +++ "b/11\354\236\245/79_\352\263\274\353\217\204\355\225\234 \353\217\231\352\270\260\355\231\224\353\212\224 \355\224\274\355\225\230\353\235\274_\352\271\200\355\230\225\354\244\200.md" @@ -96,6 +96,30 @@ notifyElementAdded 메서드에서 수행하는 순회는 동기화 블록 안에 있으므로 동시 수정이 일어나지 않도록 보장하지만 정작 자신이 콜백을 거쳐 되돌아와 수정하는 것까지 막지는 못한다고 한다. +--- + + set.addObserver(new SetObserver<> { + public void added(ObservableSet 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. 하지만 여기서, 그와 동시에 메인 스레드는 백그라운드 스레드가 관찰자를 제거하기만 기다리기 때문에 교착 상태가 일어난다고 한다. + +--- + 어떻게 리팩토링을 해야할까? 바로 @@ -145,4 +169,3 @@ StringBuffer 인스턴스는 거의 항상 단일 쓰레드에서 쓰였음에 - 멀티코어 세상인 지금은 과도한 동기화를 피하는 게 과거 어느 때보다 중요하다. - 합당한 이유가 있을 때만 내부에서 동기화하고, 동기화했는지 여부를 문서에 명확히 밝히자. -