Каков самый чистый способ утилизации переменных ThreadLocal
чтобы они были подвергнуты сборке мусора? Я прочитал из документов, что:
... после того, как поток исчезнет, все его копии локально-локальных экземпляров подлежат сборке мусора (если нет других ссылок на эти копии).
Но иногда потоки могут объединяться или не должны умирать. ThreadLocal#remove()
ли метод ThreadLocal#remove()
делает ценность объектом сбора мусора?
ThreadLocal.remove()
действительно удаляет ссылку на значение... и если нет более живой ссылки на него: значение будет скоро собрано мусором.
Когда поток умер, поток удаляется из GC-root... поэтому запись для потока в ThreadLocal подчиняется GC... поэтому значение для этой записи в ThreadLocal подчиняется GC. Но еще раз, если у вас есть еще одна живая ссылка на ценность: это не будет сбор мусора.
Если поток используется повторно (из-за части пула или...): важно вызвать remove()
чтобы это значение могло быть собрано в мусор, но также чтобы избежать неожиданного поведения при выполнении нового задания в переработанном потоке (новое задание не обязательно должно знать значение, используемое предыдущим заданием)