inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 고급편

쓰레드 로컬 동기화 - 적용

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

해결된 질문

437

컴퓨터공부하자

작성한 질문수 54

0

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

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

spring 디자인-패턴

답변 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()를 쓰는것이 좋을것 같습니다.

.
감사합니다.

0

감자맛동산

자세한 설명 감사합니다.

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

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

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

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

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

0

나무늘보

앗, 감사합니다.  :)

SpringBoot 4.0.6 버전에서 PackageLogTracePostProcessor exception

0

85

3

어드바이스 순서 디폴트 기준이 궁금합니다.

0

75

1

AspectV1 예제를 @Configuration 수동 등록으로도 가능한가요?

0

102

2

구체 클래스를 상속받아 확장한 형태도 클래스패턴/데코레이터 패턴이라고 칭하나요?

0

73

1

TraceTemplate 을 미리 빈으로 등록해서 사용할때 이렇게 설정하는게 맞는건가요?

0

69

1

Decorator 에서 추상메서드로 뺄때 질문 있습니다.

0

63

1

대상 클래스에 기본 생성자가 없을 때

0

83

1

스프링 부트 버전 4.0 aop 의존성 명칭 변경

1

407

2

final 키워드 사용 관련 질문

0

85

1

안녕하세요

0

75

1

ThradLocal 실무 사례

0

106

2

실무에서의 동시성 문제

0

73

1

로그 등 부가 기능에 대한 테스트코드

0

60

1

ProceedingJoinPoint와 MethodInvocation에 대하여

0

77

1

실무 멀티스레딩에 대한 궁금증

0

81

1

안녕하세요 질문있습니다

0

49

1

AspectV3 aop 실행 순서 문의 드립니다

0

45

1

MDC vs AOP 중에 고민중입니다.

0

85

1

순환참조

0

168

2

this를 단독으로 사용할때랑 파라미터 바인딩 할때 차이

0

83

1

빈 후처리에 등록 질문 있습니다.

0

85

1

AppConfig 설정하는 설명중에 이해가 안되는게 있습니다.

0

98

1

ThreadLocal을 지역변수로 선언하면 remove가 필요할까요?

0

122

2

@Aspect 어노테이션으로 생성된 Advisor의 Bean 저장 여부

0

76

1