Как правильно избавиться от переменных ThreadLocal?

1

Каков самый чистый способ утилизации переменных ThreadLocal чтобы они были подвергнуты сборке мусора? Я прочитал из документов, что:

... после того, как поток исчезнет, все его копии локально-локальных экземпляров подлежат сборке мусора (если нет других ссылок на эти копии).

Но иногда потоки могут объединяться или не должны умирать. ThreadLocal#remove() ли метод ThreadLocal#remove() делает ценность объектом сбора мусора?

Теги:
multithreading
garbage-collection
thread-local

1 ответ

2
Лучший ответ

ThreadLocal.remove() действительно удаляет ссылку на значение... и если нет более живой ссылки на него: значение будет скоро собрано мусором.

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

Если поток используется повторно (из-за части пула или...): важно вызвать remove() чтобы это значение могло быть собрано в мусор, но также чтобы избежать неожиданного поведения при выполнении нового задания в переработанном потоке (новое задание не обязательно должно знать значение, используемое предыдущим заданием)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню