traceIdHolder.remove()와 traceIdHolder.set(null)의 차이가 있나요?
안녕하세요 강의 잘 보고 있습니다.
traceIdHolder.remove()와 traceIdHolder.set(null)의 차이점이 궁금합니다. 실험해보니까 set(null)로 해도 잘 동작합니다만 아무래도 remove()라는 함수가 따로 있는 이유가 있을 것 같아서요.
답변 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이라는 맵을 참조하고 있습니다
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





