--- kind: CONCEPT slug: messaging-observability-c06 title: Set 인스턴스를 락으로 쓰지만 외부 경합이 없다 topic: state-machines-and-ownership project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: concept:messaging-observability-c06 evidenceCapturedOn: 2026-09-01 assets: - key: messaging-observability-c06 file: ../../../final/evidence/rendered/messaging-observability-c06.svg evidence: - ../../../final/evidence/raw/messaging-observability-c06.txt source: - 원본 분석 절은 analysis/messaging/messaging-observability.md#L363 이다. module: messaging-observability --- # Set 인스턴스를 락으로 쓰지만 외부 경합이 없다 트랜잭션이 없고, 이 leaf는 messaging family에서 `messaging-transport-spi` 다음으로 동시성이 조밀하다. ## 관계 - **타입이 문서화한 불변식은 타입이 강제한다** 같은 분석 리프에서 끌어낸 규칙이다. ## 본문 트랜잭션 없음. 이 leaf는 messaging family에서 `messaging-transport-spi` 다음으로 동시성이 조밀하다. `MessagingRedactor`·`MessagingTracer`·`DefaultMessagingObservationConvention`은 상태가 없고 `MessagingTags`는 불변 record다. ## MessagingRedactor 참조 위치 :::evidence key="messaging-observability-c06" alt="코드베이스에서 MessagingRedactor 를 검색한 출력 13줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="MessagingRedactor 코드베이스 검색 — 13줄 · exit 0" zoom="true" ::: ## Set 인스턴스를 락으로 쓰는 것이 안전한 이유 **`synchronized(values)`가 `Set` 인스턴스를 락으로 쓴다.** 그 `Set`은 `ConcurrentHashMap.newKeySet()`이고 외부에 노출되지 않으므로(`observed` 맵이 private) 외부 락 경합은 없다. 차원별로 락이 분리되는 효과도 있다.