세션 close 경쟁

정상 finally와 shutdown 스레드가 동시에 닫을 수 있어 단일 전환이 필요하다.

run finally

세션 업무가 끝나 close한다.

정상 경로

shutdown coordinator

전체 종료로 close한다.

외부 경로

AtomicBoolean

첫 호출만 Socket을 닫는다.

멱등성

onClosed callback

레지스트리에서 제거한다.

한 번 실행
결과먼저 닫은 쪽이 read를 깨우고 두 번째 close는 아무 일도 하지 않는다.

핵심: callback 실패는 별도 계측하되 자원 종료를 되돌리지 않는다.