如何正确处理ThreadLocal变量?

时间:2015-02-04 21:06:49

标签: java multithreading garbage-collection thread-local

处理ThreadLocal变量的最简洁方法是什么,以便它们受垃圾收集?我从docs读到:

  

...一个线程消失后,它的所有线程局部实例副本都会被垃圾收集(除非存在对这些副本的其他引用)。

但有时可以汇集线程或预计不会死亡。 ThreadLocal#remove()方法实际上是否使值受到垃圾回收?

1 个答案:

答案 0 :(得分:2)

ThreadLocal.remove()确实删除了对值的引用...和如果没有更多其他生存引用:该值将很快被垃圾收集。

当线程死亡时,线程从GC-root中删除...因此ThreadLocal中线程的条目受GC的影响...因此ThreadLocal中此条目的值受GC影响。但是再一次,如果你有另一个生活参考价值:它不会被垃圾收集。

如果线程被重用(因为池的一部分或......):调用remove()以便可以对值进行垃圾收集,同时避免在新作业出现时出现意外行为也很重要在循环线程上执行(新作业不需要知道上一个作业使用的值)