java - 如何正确处理ThreadLocal变量?

标签 java multithreading garbage-collection thread-local

处理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 根中删除...因此 ThreadLocal 中该线程的条目将受到 GC...因此 ThreadLocal 中该条目的值将受到 GC。但再一次,如果您有另一个对该值的活引用:它不会被垃圾收集。

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

关于java - 如何正确处理ThreadLocal变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28331450/

相关文章:

android - 中断 HttpURLConnection 请求 Android

language-agnostic - 为什么托管语言不提供手动删除对象的能力?

.NET 垃圾收集 (GC) 调整

java - 不知道为什么我在这里被划红线

java - 编写一个方法用 '%20' 替换字符串中的所有空格?

java - XBee 连接到 Android 手机

java - 类变量初始值设定项、类的静态初始值设定项和字段初始值设定项之间的区别

multithreading - 在 Perl 中是否有线程安全的打印方式?

Java并发问题——在一个集合上同步

Java input = ""与 input = null 不同吗?