Thread Local
정의
•
해당 쓰레드만 접근할 수 있는 특별한 저장소
◦
각 쓰레드마다 별도의 내부 저장소를 제공 → 같은 인스턴스의 쓰레드 로컬 필드에 접근해도 문제가 없다!
◦
These variables differ from their normal counterparts in that each thread that accesses one (via its getor setmethod) has its own, independently initialized copy of the variable
•
같은 Instance Field 사용시, static 같은 공용 Field 사용시 발생하는 동시성 이슈 해결 가능
Method
•
withInitial
◦
supplier를 사용해서 ThreadLocal value값을 초기화 (SuppliedThreadLocal)
◦
ThreadLocal.get 메소드가 처음 호출되었을 때 초기화된다!
•
get
•
set
•
remove
예제
private ThreadLocal<TraceId> traceIdHolder = new ThreadLocal<TraceId>();
// private static final ThreadLocal<TraceId> traceIdHolder = ThreadLocal.withInitial(() -> new TraceId()); // Initialize
@Override
public TraceStatus begin(String message) {
syncTraceId();
TraceId traceId = traceIdHolder.get(); // 동기화 후 가져다쓰기
Long startTimeMs = System.currentTimeMillis();
log.info("[{}] {}{}", traceId.getId(), addSpace(START_PREFIX, traceId.getLevel()), message);
return new TraceStatus(traceId, startTimeMs, message);
}
private void syncTraceId() {
TraceId traceId = traceIdHolder.get();
if (traceId == null) {
traceIdHolder.set(new TraceId());
} else {
traceIdHolder.set(traceId.createNextId());
}
}
Java
복사
ThreadLocal.withInitial vs new ThreadLocal
•
new ThreadLocal로 객체 생성후 get
◦
return null
•
withInitial로 객체 생성후 get
◦
return Supplier.get() (Supplier value로부터 초기화)