简而言之- tomcat使用线程池,因此可以重用线程。一些库使用ThreadLocal变量,但不清理它们(使用.remove()),因此实际上它们将“脏”线程返回到池中。
ThreadLocal
.remove()
Tomcat具有新功能,可以在关机时检测到这些情况并清理线程本地。但这意味着线程在整个执行过程中都是“脏”的。
我能做的就是实现一个Filter,然后在请求完成之后(线程返回到池中)ThreadLocal,使用tomcat中的代码清理所有s (该方法称为checkThreadLocalsForLeaks)。
Filter
checkThreadLocalsForLeaks
问题是,这值得吗?两个优点:
一个缺点:
Field
另一种选择是将问题报告给不清除线程本地变量的库。
我会通过以下两个途径向图书馆开发人员报告问题:
老实说,我以前从未见过这种错误,我认为这是一个例外,而不是我们经常发生的情况应注意的错误。您能否分享您在哪个图书馆看到过这种行为?
附带说明一下,如果您仍然附加了ThreadLocal变量,则我不介意在开发/测试环境中启用该筛选器并记录严重错误。