【发布时间】:2012-05-15 06:12:57
【问题描述】:
在一个类中定义了一个线程局部变量来维护一些实例。设置和获取递归方法。当请求完成时,我有点无法清除 threadlocal 变量(我已经以所有其他方式进行了分析。我无法清除 threadlocal)。
我的问题是,如果我没有为每个请求清除线程局部变量,会发生什么?有什么影响?
【问题讨论】:
标签: java thread-local
在一个类中定义了一个线程局部变量来维护一些实例。设置和获取递归方法。当请求完成时,我有点无法清除 threadlocal 变量(我已经以所有其他方式进行了分析。我无法清除 threadlocal)。
我的问题是,如果我没有为每个请求清除线程局部变量,会发生什么?有什么影响?
【问题讨论】:
标签: java thread-local
javadoc 说:
在一个线程消失后,它的所有线程本地实例的副本 受到垃圾回收的影响(除非对这些的其他引用 副本存在)。
例如,这里的the implementation 由使用weak references 作为键的哈希表支持。在这种情况下,关键是线程。如果线程终止,则映射中的条目将有资格进行垃圾回收。
只有在系统开始耗尽内存空间时才会发生垃圾收集。但是这种考虑适用于系统中的所有对象:对象何时开始被回收取决于 GC 策略,该策略是 VM 特定的并且需要进行调整。
这是我对线程局部变量的好坏使用的看法:
如果要解决并发问题,最好使用线程局部变量。例如,避免an object that is not thread-safe by keeping one copy per thread 的同步。或者解决与并发相关的其他设计问题。
如果关键是要以一种廉价的方式在调用链中“传递参数”,那它很糟糕。您应该更好地重构代码并将对象作为常规方法参数传递到调用链中。
可以使用本地线程来存储某种形式的“当前”上下文,例如当前请求。
【讨论】:
如果线程终止,对 ThreadLocal 条目的引用也会终止,因此您的对象(假设没有其他引用)将被垃圾回收。
只要线程存在,你的对象也会存在。
您必须评估长期存在的对象对您的影响。
【讨论】:
您有内存泄漏,可能已经设置了 ThreadLocal,下次调用您的代码时。 ThreadLocals 有点像 imo 的代码味道。
【讨论】: