2012-05-15 121 views
5

在类中定义了一个threadlocal变量来维护一些实例。设置和获取递归方法。当请求完成时(我已经用其他方式分析过,我无法清除threadlocal),我无法清除threadlocal变量。如果不清除ThreadLocal变量,会发生什么情况?

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

回答

2

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

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

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

+0

感谢波希米亚对你的回应。因此,在服务下一个请求时,我不会从threadlocal(之前的请求)获取旧值。 – Shahul

+0

是的,我认为你会,因为服务器倾向于重用线程。 – keuleJ

0

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

9

的Javadoc说:一个线程消失

后,所有线程本地实例 其副本都会被垃圾回收(除非存在对这些副本 其它参考资料)。

例如,the implementation这里被使用weak references为重点哈希表支持。在这种情况下,关键是线程。如果线程终止,映射中的条目就有资格进行垃圾回收。

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

这是我的线程局部变量的好的和不好的用法的观点:

  • OT使用线程局部变量,如果关键是要解决并发问题。例如,避免同步an object that is not thread-safe by keeping one copy per thread。或者解决与并发有关的其他设计问题。

  • 是坏的如果重点是以一种便宜的方式“传递一个参数”的电话链。您应该更好地重构代码,并将该对象作为常规方法参数传递给调用链。

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

相关问题