素朴に、私は 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 も残りの値もガベージコレクションされないという奇妙な問題を防ぎます。(おそらく、これの最も悪質な形式は、値が参照するクラスの静的変数が ThreadLocal である場合に発生します。オブジェクトもそのクラスも収集できないため、アプリケーション サーバーの再デプロイで大きなリソース リークが発生します。)