해결된 질문
21.11.02 04:21 작성
·
338
답변 1
11
안녕하세요, 컴퓨터공부하자 님. 공식 서포터즈 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이라는 맵을 참조하고 있습니다