인프런 커뮤니티 질문&답변

컴퓨터공부하자님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 고급편

쓰레드 로컬 동기화 - 적용

traceIdHolder.remove()와 traceIdHolder.set(null)의 차이가 있나요?

해결된 질문

21.11.02 04:21 작성

·

338

0

안녕하세요 강의 잘 보고 있습니다.

traceIdHolder.remove()와 traceIdHolder.set(null)의 차이점이 궁금합니다. 실험해보니까 set(null)로 해도 잘 동작합니다만 아무래도 remove()라는 함수가 따로 있는 이유가 있을 것 같아서요.

답변 1

11

codesweaver님의 프로필 이미지

2021. 11. 02. 10:42

안녕하세요, 컴퓨터공부하자 님. 공식 서포터즈 codesweaver 입니다.
.
코드상으로 말하면 Thread는 ThreadLocalMap이라는 맵을 참조학 있습니다. 이 맵의 키와 값은 <ThreadLocal, Entry>로 되어있는데 이 중 스레드로컬값 으로 우리가 저장한 값이 Entry에 저장됩니다. 

 

set(null)을 호출하면 이 Entry에 null이 할당되며 ThreadLocal은 아직 존재하기에 ThreadLocalMap에 해당 데이터는 존재하게 됩니다. 반면 remove()를 호출하면 ThreadLocal에 대한 삭제를 진행하므로 ThreadLocalMap에서 ThreadLocal, Entry 모두 삭제됩니다.

 

.이러한 차이로 쓰레드풀을 이용할 때 remove()를 호출하지 않으면 메모리 누수가 발생한다는 이슈가 있습니다(https://github.com/spring-cloud/spring-cloud-sleuth/issues/27). 

 

이 외에도 set() 함수는 어떤 값을 설정하겠다는 의미입니다. null 은 어떤 값을 설정한다는 의미보다는 데이터를 삭제한다, 초기화한다는 의미가 강하므로 코드의 의도를 명백히 드러낸다는점에서도 remove()를 쓰는것이 좋을것 같습니다.

.
감사합니다.

감자맛동산님의 프로필 이미지

2022. 03. 30. 17:56

자세한 설명 감사합니다.

자잘하지만, 두번째 문단의 첫번째 문장에 오타가 있어서 제보해드려요.

===================================

코드상으로 말하면 Thread는 ThreadLocalMap이라는 맵을 참조학 있습니다

===================================

코드상으로 말하면 Thread는 ThreadLocalMap이라는 맵을 참조하고 있습니다

codesweaver님의 프로필 이미지

2022. 04. 01. 09:43

앗, 감사합니다.  :)