【问题标题】:If not cleared ThreadLocal variable, What will happen?如果不清除 ThreadLocal 变量,会发生什么?
【发布时间】:2012-05-15 06:12:57
【问题描述】:

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

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

【问题讨论】:

    标签: java thread-local


    【解决方案1】:

    javadoc 说:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 感谢波西米亚人的回复。因此,在处理下一个请求时,我不会从 threadlocal(上一个请求的)获取旧值.. rite?
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-19
        • 1970-01-01
        • 1970-01-01
        • 2011-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多