天真地,我期望 ThreadLocal 是某种 Thread 到值类型的 WeakHashMap。所以当我得知 ThreadLocal 的值实际上保存在 Thread 的映射中时,我有点困惑。为什么这样做?如果值保存在 ThreadLocal 本身中,我希望不会存在与 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 及其剩余值都不会被垃圾收集,直到 Thread 死亡。(当 ThreadLocal 是值所引用的类上的静态变量时,可能会发生这种情况的最狡猾的形式。现在,由于无法收集对象及其类,因此在应用程序服务器中重新部署时会出现大量资源泄漏。)