Naively, 나는 ThreadLocal이 값 유형에 대한 Thread의 WeakHashMap과 같은 어떤 것으로 기대했다. 그래서 ThreadLocal의 값이 실제로 saved in a map in the Thread이라는 것을 알았을 때 약간의 의아해했습니다. 그렇게 된 이유는 무엇입니까? 값이 ThreadLocal 자체에 저장되는 경우 ThreadLocal과 연결된 resource leaks이 거기에 없을 것으로 예상됩니다.java.lang.ThreadLocal이 ThreadLocal 대신에 Thread의 맵입니까?
명확한 설명 : 나는 스레드가 사망 할 때까지이있어 ThreadLocal도이 값을 통해 남아도는 지금까지 가비지 수집 될 수 있다는 이상한 문제를 방지 할 볼 수있는 나는 지금까지
public class AlternativeThreadLocal<T> {
private final Map<Thread, T> values =
Collections.synchronizedMap(new WeakHashMap<Thread, T>());
public void set(T value) { values.put(Thread.currentThread(), value); }
public T get() { return values.get(Thread.currentThread());}
}
같은 것을 생각하고 있었는데 그 값이 ThreadLocal 그 자체를 어떻게 든 강하게 참조한다면. (ThreadLocal이 값을 참조하는 클래스의 정적 변수 인 경우 가장 눈에 띄는 형태 일 것입니다.) 이제 개체 나 클래스를 수집 할 수 없기 때문에 응용 프로그램 서버의 재배치시 큰 리소스 누출이 발생합니다.
ThreadLocal 메모리 누수의 더 위험한 형태는 값과 ThreadLocal 자체 사이의 원형에 기인합니다. 이것은 ThreadLocal을 멤버로 선언하는 클래스를 확장하는 값과 같이 미묘한 방식으로 발생합니다. – erickson
실랑킹 (sylvarking)에 의해 논의 된 더 많은 문제가있는 누출을 실제로 생각하고있었습니다. API에 관해서는 현재의 API와 동일 할 수 있습니다 (내 설명 참조). 맵은 합리적인 API 디자이너에 의해 숨겨 질 것입니다. :-) –