在类中定义了一个threadlocal变量来维护一些实例。设置和获取递归方法。有些我无法在请求完成时清除threadlocal变量(我已经用其他所有方式进行了分析。我无法清除threadlocal)。
我的问题是,如果我没有为每个请求清除threadlocal变量,会发生什么?有什么影响?
答案 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。