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

Sha*_*hul 5 java thread-local

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

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

ewe*_*nli 10

javadoc说:

在一个线程消失之后,它的所有线程局部实例副本都要进行垃圾收集(除非存在对这些副本的其他引用).

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

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

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

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

  • 如果重点是以便宜的方式"通过参数"向下调用链接,这是很糟糕的.您应该更好地重构代码并将对象作为常规方法参数传递给调用链.

  • 是确定使用线程本地存储某种形式的"当前"的背景下,如当前请求的.


Boh*_*ian 2

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

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

您必须评估对您的对象的长期寿命有什么影响。