Наивно, я ожидал, что ThreadLocal будет чем-то вроде WeakHashMap of Thread для типа значения. Поэтому я был немного озадачен, когда узнал, что значения 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, ни его оставшиеся значения никогда не будут собираться мусором до тех пор, пока Thread не умрет, если значение каким-либо образом строго ссылается на сам ThreadLocal.
(Вероятно, наиболее хитрая форма этого происходит, когда ThreadLocal является статической переменной в классе, на который ссылается значение. Теперь у вас есть большая утечка ресурсов при повторном развертывании на серверах приложений, поскольку ни объекты, ни их классы не могут быть собраны.)