有人有一个如何做到这一点的例子吗?它们是由垃圾收集器处理的吗?我正在使用 Tomcat 6。
javadoc 是这样说的:
“只要线程处于活动状态并且 ThreadLocal 实例可访问,每个线程就持有对其线程局部变量副本的隐式引用;线程消失后,其所有线程局部实例副本都将受到垃圾回收(除非存在对这些副本的其他引用)。
如果您的应用程序或(如果您正在谈论请求线程)容器使用线程池,则意味着线程不会死亡。如有必要,您需要自己处理线程局部变量。执行此操作的唯一干净方法是调用ThreadLocal.remove()
method.
您可能想要清理线程池中线程的线程局部变量有两个原因:
- 防止内存(或假设的资源)泄漏,或者
- 以防止信息通过线程局部变量从一个请求意外泄漏到另一个请求。
线程本地内存泄漏通常不应成为有界线程池的主要问题,因为任何线程本地内存最终都可能被覆盖;即当线程被重用时。但是,如果您错误地创建了一个新的ThreadLocal
一遍又一遍地实例(而不是使用static
变量来保存单例实例),线程本地值不会被覆盖,并且会累积在每个线程的threadlocals
地图。这可能会导致严重泄漏。
假设您正在讨论在 Web 应用程序处理 HTTP 请求期间创建/使用的线程局部变量,那么避免线程局部泄漏的一种方法是注册一个ServletRequestListener
与你的网络应用程序的ServletContext
并实现侦听器的requestDestroyed
方法来清理当前线程的线程局部变量。
请注意,在这种情况下,您还需要考虑以下可能性信息从一个请求泄漏到另一个请求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)