如果不在服务器环境中部署,是否需要在本地线程上调用remove,即使应用程序使用缓存的线程池?
public static ThreadLocal<Integer> i = new ThreadLocal<Integer>(){{
public Integer initialValue(){return 3;}
};
Run Code Online (Sandbox Code Playgroud)
...一个线程消失后,它的所有线程局部实例副本都会被垃圾收集...
如果线程可能仍然存在,并且您希望资源解除引用,则更好地调用remove().
听起来你可能想要考虑使用一个简单的局部变量,如果你想清除它.
理论上,如果 和Thread仍然ThreadLocal发挥作用,该值是可以达到的。如果其中任何一个无法访问,理论上,如果未引用该值,则该值是可垃圾回收的。然而,OpenJDK 中有一个错误,这意味着如果值引用了ThreadLocal(令人惊讶的常见)并且Thread仍在运行,它就会泄漏。
所以,是的,从某种意义上说,服务器环境没有什么特别的。ThreadLocal但是,通常在开发过程中重复重新加载代码的情况下,通常会出现从值(值到值的类到类的类加载器到所有类)可访问的情况-通过类加载器加载到这些类的静态字段到 a ThreadLocal)。Java Beans 和 JDBC 的实现可能有类似的问题。
| 归档时间: |
|
| 查看次数: |
296 次 |
| 最近记录: |