5

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

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

2 回答 2

5

根据javadocThreadLocal

...在线程消失后,其所有线程本地实例的副本都将受到垃圾收集...

如果线程可能仍然存在,并且您希望取消引用资源,最好调用remove().


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

于 2012-11-06T18:40:38.163 回答
2

理论上,如果ThreadThreadLocal仍然在起作用,则该值将是可以达到的。如果其中任何一个都不可达,理论上,如果没有被引用,则该值是可垃圾回收的。但是,OpenJDK 中有一个错误,这意味着如果该值引用了(令人惊讶的ThreadLocal常见)并且Thread仍在运行,它将泄漏。

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

于 2012-11-06T18:52:09.797 回答