【问题标题】:How to properly dispose of ThreadLocal variables?如何正确处理 ThreadLocal 变量?
【发布时间】:2015-02-04 21:06:48
【问题描述】:
处置ThreadLocal 变量以便它们接受垃圾回收的最干净的方法是什么?我从docs 中读到:
...在线程消失后,它的所有线程本地实例副本都将受到垃圾回收(除非存在对这些副本的其他引用)。
但有时线程可以被池化或预计不会死亡。 ThreadLocal#remove() 方法是否真的使值受到垃圾回收?
【问题讨论】:
标签:
java
multithreading
garbage-collection
thread-local
【解决方案1】:
ThreadLocal.remove() 确实删除了对该值的引用...并且如果没有更多其他对它的引用:该值将很快被垃圾收集。
当线程死亡时,线程从 GC-root 中移除...因此 ThreadLocal 中线程的条目受 GC... 因此 ThreadLocal 中此条目的值受 GC。但是再一次,如果你有另一个活的值引用:它不会被垃圾收集。
如果线程被重用(因为是池的一部分或...):调用remove() 以便可以对值进行垃圾收集很重要,但也可以避免在执行新作业时出现意外行为一个回收的线程(新作业不需要知道之前作业使用的值)