[Java] Threadlocal의 remove 과정 - weak/strong reference

Hyo Kyun Lee·2025년 1월 23일
0

Java

목록 보기
85/87

1. 개요

스레드로컬변수는 말그대로 각 스레드가 고유하게 가질 수 있는 로컬변수를 의미하는데, 공통적으로 반드시 remove를 사용하라는 내용의 글들이 많았다.

하지만 remove를 반드시 사용하라는 절대적인 약속은 없을 것이라는 생각이 들어서 좀 더 알아봤고, 나와 같은 고민을 한 글들이 있을지 한번 살펴보았다.

이를 통해 remove와 setNull(set(""))의 차이점을 어떠한 방향으로 바라보는 것이 좋을지 한번 알아보았다.

2. remove 과정

remove 과정을 보기전에 스레드로컬의 get, set 메소드를 먼저 살펴보아야 한다.

public T get(){
  Thread t = Thread.currentThread();
  ThreadLocalMap map = getMap(t);
  
  if (map != null) {
  	ThreadLocalMap.Entry e = map.getEntry(this);
    if (e != null) {
      @SuppressWarnings("unchecked")
      T result = (T) e.value;
      return result;
  	}
  } 
  
  return setInitialValue();
}

스레드로컬맵에 현재 스레드를 key값으로 하여 value값을 제공해준다.
key값에 해당하는 value가 없다면 setInitialValue() 메서드를 제공받아 최초 접근시 디폴트(thread-1)값을 설정하여 스레드로컬 변수를 설정한다.

public void set(T value) {
  Thread t = Thread.currentThread();
  ThreadLocalMap map = getMap(t);
  
  if (map != null) {
  	map.set(this, value);
  } else{
  	createMap(t, value);
  }
}

스레드로컬맵에 현재 스레드를 key값으로 하는 map이 존재하면 생성, 존재하지 않을 경우 덮어씌운다.

따라서 스레드풀을 사용하는 환경이라면 스레드가 재생성됨으로인해 스레드로컬변수도 같이 재활용, 이로 인해 스레드로컬변수를 get하였을때 최초 디폴트값이 아닌 예상하지 못한 값을 얻을 수 있다.

이것이 강한 참조에 의한 오류이다.

public void remove() {
  ThreadLocalMap m = getMap(Thread.currentThread());
  if (m != null) {
  	m.remove(this);
  }
}

최종적으로 제거할때 현재 스레드에 해당하는 map값이 존재한다면 제거한다.

스레드로컬변수를 스레드 풀 환경에서 재사용하는 오류를 방지하기 위해선 반드시 remove를 해주어야 한다.

3. remove를 해주는 이유

remove를 스레드 풀을 이용하지 않는 환경이라면 스레드를 재사용하지 않으므로 remove를 필수적으로 사용하지 않아도 되지만, (결국 객체를 map에 저장하는 형태이므로)강한 참조로 인해 gc를 하지않고 포인터를 그대로 남겨두므로 웬만해선 하는게 맞다.

메모리릭이 발생할 수 있기때문에 Java 공식문서에서도 remove 사용을 권장하고 있다.

map에 해당 값이 존재하느냐, 존재하지 않느냐의 단순한 문제가 아닌 메모리 관점이나 성능적으로 부정적인 영향을 미칠 수 있으므로 스레드 로컬을 사용했다면 반드시 remove를 해주도록 한다.

4. 참고자료

ThreadLocal remove vs setNull - https://stackoverflow.com/questions/12424838/threadlocal-remove
Memory leaks - https://medium.com/@qingedaig/java-thread-local-variables-9726cb140306
스레드로컬 개괄 - https://evoblog.life/thread-local/
강한참조/약한참조 - https://roomenergy.tistory.com/49

0개의 댓글

관련 채용 정보