处理ThreadLocal
变量的最简洁方法是什么,以便它们受垃圾收集?我从docs读到:
...一个线程消失后,它的所有线程局部实例副本都会被垃圾收集(除非存在对这些副本的其他引用)。
但有时可以汇集线程或预计不会死亡。 ThreadLocal#remove()
方法实际上是否使值受到垃圾回收?
答案 0 :(得分:2)
ThreadLocal.remove()
确实删除了对值的引用...和如果没有更多其他生存引用:该值将很快被垃圾收集。
当线程死亡时,线程从GC-root中删除...因此ThreadLocal中线程的条目受GC的影响...因此ThreadLocal中此条目的值受GC影响。但是再一次,如果你有另一个生活参考价值:它不会被垃圾收集。
如果线程被重用(因为池的一部分或......):调用remove()
以便可以对值进行垃圾收集,同时避免在新作业出现时出现意外行为也很重要在循环线程上执行(新作业不需要知道上一个作业使用的值)