线程局部删除方法

Sam*_*msh 5 java concurrency

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

public static ThreadLocal<Integer> i = new ThreadLocal<Integer>(){{
    public Integer initialValue(){return 3;}
};
Run Code Online (Sandbox Code Playgroud)

Boh*_*ian 5

根据javadocThreadLocal:

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

如果线程可能仍然存在,并且您希望资源解除引用,则更好地调用remove().


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


Tom*_*ine 2

理论上,如果 和Thread仍然ThreadLocal发挥作用,该值是可以达到的。如果其中任何一个无法访问,理论上,如果未引用该值,则该值是可垃圾回收的。然而,OpenJDK 中有一个错误,这意味着如果值引用了ThreadLocal(令人惊讶的常见)并且Thread仍在运行,它就会泄漏。

所以,是的,从某种意义上说,服务器环境没有什么特别的。ThreadLocal但是,通常在开发过程中重复重新加载代码的情况下,通常会出现从值(值到值的类到类的类加载器到所有类)可访问的情况-通过类加载器加载到这些类的静态字段到 a ThreadLocal)。Java Beans 和 JDBC 的实现可能有类似的问题。