Search
〰️

Thread Local

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로부터 초기화)