ThreadLocal
использует WeakReference
внутри. Если на ThreadLocal
нет жестких ссылок, он будет собираться мусором, даже если различные потоки имеют значения, сохраненные с помощью этого ThreadLocal
.
Кроме того, значения ThreadLocal
фактически сохраняются в Thread
; если поток умирает, все значения, связанные с этим потоком через ThreadLocal
, собираются.
Если у вас есть ThreadLocal
в качестве последнего члена класса, это сильная ссылка, и ее нельзя собрать, пока класс не выгружен. Но так работает любой ученик, и это не считается утечкой памяти.
Обновление: Упомянутая проблема вступает в игру только тогда, когда значение, сохраненное в ThreadLocal
, строго указывает на то, что ThreadLocal
- своего рода круговая ссылка.
В этом случае значение (a SimpleDateFormat
) не имеет обратной ссылки на ThreadLocal
. В этом коде нет утечки памяти.