5

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

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

4

3 回答 3

10

javadoc 说:

在线程消失后,它的所有线程本地实例副本都将受到垃圾回收(除非存在对这些副本的其他引用)。

例如,这里的实现由使用弱引用作为键的 HashTable 支持。在这种情况下,关键是线程。如果线程终止,则映射中的条目将有资格进行垃圾回收。

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

这是我对线程局部变量的好坏使用的看法:

  • 如果要解决并发问题,最好使用线程局部变量。例如,通过为每个线程保留一份副本来避免非线程安全对象的同步。或者解决与并发相关的其他设计问题。

  • 如果重点是以廉价的方式在调用链中“传递参数”,那就太糟糕了。您应该更好地重构代码并将对象作为常规方法参数传递到调用链中。

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

于 2012-05-15T06:55:05.857 回答
2

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

只要线程存在,您的对象也会存在。

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

于 2012-05-15T06:18:15.683 回答
0

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

于 2012-05-15T06:19:43.063 回答