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