如何正确处理 ThreadLocal 变量?
How to properly dispose of ThreadLocal variables?
什么是最干净的处理 ThreadLocal
变量的方法,以便它们可以进行垃圾回收?我从 docs 中读到:
...after a thread goes away, all of its copies of thread-local instances are subject to garbage collection (unless other references to these copies exist).
但有时线程可以被合并或预计不会死亡。 ThreadLocal#remove()
方法是否真的使该值受到垃圾收集?
ThreadLocal.remove()
确实正在删除对该值的引用...并且 如果没有更多 其他活的引用:该值将很快被垃圾收集.
当线程死亡时,线程从 GC-root 中删除...因此 ThreadLocal 中线程的条目受 GC...因此 ThreadLocal 中此条目的值受制于GC。但是再一次,如果您有另一个对该值的活引用:它不会被垃圾收集。
如果线程被重用(因为池的一部分或...):调用 remove()
很重要,这样值可以被垃圾收集,同时也可以避免在新线程出现意外行为时作业在回收线程上执行(新作业不需要知道前一个作业使用的值)
什么是最干净的处理 ThreadLocal
变量的方法,以便它们可以进行垃圾回收?我从 docs 中读到:
...after a thread goes away, all of its copies of thread-local instances are subject to garbage collection (unless other references to these copies exist).
但有时线程可以被合并或预计不会死亡。 ThreadLocal#remove()
方法是否真的使该值受到垃圾收集?
ThreadLocal.remove()
确实正在删除对该值的引用...并且 如果没有更多 其他活的引用:该值将很快被垃圾收集.
当线程死亡时,线程从 GC-root 中删除...因此 ThreadLocal 中线程的条目受 GC...因此 ThreadLocal 中此条目的值受制于GC。但是再一次,如果您有另一个对该值的活引用:它不会被垃圾收集。
如果线程被重用(因为池的一部分或...):调用 remove()
很重要,这样值可以被垃圾收集,同时也可以避免在新线程出现意外行为时作业在回收线程上执行(新作业不需要知道前一个作业使用的值)