如果没有清除ThreadLocal变量,会发生什么?

时间:2012-05-15 06:12:58

标签: java thread-local

在类中定义了一个threadlocal变量来维护一些实例。设置和获取递归方法。有些我无法在请求完成时清除threadlocal变量(我已经用其他所有方式进行了分析。我无法清除threadlocal)。

我的问题是,如果我没有为每个请求清除threadlocal变量,会发生什么?有什么影响?

3 个答案:

答案 0 :(得分:10)

javadoc说:

  

一个线程消失后,它的所有线程局部实例副本   受垃圾收集(除非其他参考这些   副本存在)。

例如,此处the implementation由HashTable支持,该HashTable使用weak references作为密钥。在这种情况下,键是线程。如果线程终止,则映射中的条目将有资格进行垃圾回收。

垃圾收集可能仅在系统开始耗尽内存空间时才会发生。但是这种考虑适用于系统中的所有对象:当对象开始被回收时,取决于GC策略,这是VM特定的并且可以进行调整。

这是我对线程本地化的好坏使用的看法:

  • 很好如果要解决并发问题,请使用线程本地。例如,避免同步an object that is not thread-safe by keeping one copy per thread。或者解决与并发相关的其他设计问题。

  • 如果要以便宜的方式将“参数”传递给调用链,那么是不好的。您应该更好地重构代码并将对象作为常规方法参数传递给调用链。

  • 可以使用本地线程存储某种形式的“当前”上下文,例如当前的要求。

答案 1 :(得分:2)

如果线程死掉,那么对ThreadLocal条目的引用也是如此,因此你的对象(假设没有其他引用)将被垃圾收集。

只要线程存在,你的对象就会存在。

您必须评估对象长期存在的影响。

答案 2 :(得分:0)

下次调用代码时,内存泄漏并且可能已经设置了ThreadLocal。 ThreadLocals有点代码味道imo。