线程局部删除方法

时间:2012-11-06 18:38:04

标签: java concurrency

如果您未在服务器环境中部署,是否需要在本地线程上调用remove,即使应用程序使用缓存的线程池?

public static ThreadLocal<Integer> i = new ThreadLocal<Integer>(){{
    public Integer initialValue(){return 3;}
};

2 个答案:

答案 0 :(得分:5)

根据javadoc for ThreadLocal

  

...一个线程消失后,它的所有线程局部实例副本都会被垃圾收集...

如果线程可能仍然存在,并且您希望资源取消引用,请更好地致电remove()


听起来你可能想要考虑使用一个简单的局部变量,如果你想清除它。

答案 1 :(得分:2)

理论上,如果ThreadThreadLocal仍在播放中,则该值将可以访问。如果其中任何一个都无法访问,理论上,如果没有引用,则该值是垃圾可收集的。但是,OpenJDK中存在一个错误,这意味着如果值引用ThreadLocal(令人惊讶的常见)Thread仍在运行,则会泄漏。

所以是的,从某种意义上说,服务器环境并没有什么特别之处。但是,通常在开发过程中重复加载代码的地方通常会出现ThreadLocal从值(值到类的类到类的类加载器到达)到达的情况。 all-classes-ever-loaded-through-class-loader to static-fields-of-classes-classes to ThreadLocal)。 Java Bean和JDBC的实现可能有类似的问题。