如果您未在服务器环境中部署,是否需要在本地线程上调用remove,即使应用程序使用缓存的线程池?
public static ThreadLocal<Integer> i = new ThreadLocal<Integer>(){{
public Integer initialValue(){return 3;}
};
答案 0 :(得分:5)
...一个线程消失后,它的所有线程局部实例副本都会被垃圾收集...
如果线程可能仍然存在,并且您希望资源取消引用,请更好地致电remove()
。
听起来你可能想要考虑使用一个简单的局部变量,如果你想清除它。
答案 1 :(得分:2)
理论上,如果Thread
和ThreadLocal
仍在播放中,则该值将可以访问。如果其中任何一个都无法访问,理论上,如果没有引用,则该值是垃圾可收集的。但是,OpenJDK中存在一个错误,这意味着如果值引用ThreadLocal
(令人惊讶的常见)和,Thread
仍在运行,则会泄漏。
所以是的,从某种意义上说,服务器环境并没有什么特别之处。但是,通常在开发过程中重复加载代码的地方通常会出现ThreadLocal
从值(值到类的类到类的类加载器到达)到达的情况。 all-classes-ever-loaded-through-class-loader to static-fields-of-classes-classes to ThreadLocal
)。 Java Bean和JDBC的实现可能有类似的问题。