3 回答

TA貢獻1831條經驗 獲得超4個贊
是的,你需要清除ThreadLocal。Tomcat 不會清除 ThreadLocals。
不,并不是每次都會創建新線程。池中的線程用于服務請求,并在請求完成后返回池。
這不僅適用于 Tomcat,也適用于 Jetty 和 Undertow。為每個請求創建線程在資源和時間方面都是昂貴的。

TA貢獻1876條經驗 獲得超6個贊
不,Tomcat 不會清除您的代碼創建的 ThreadLocals,這意味著它們將保留并可能污染后續請求。
因此,每當您創建一個請求時,請確保在同一請求或任何其他請求存在之前將其清除。
還應該注意的是,后續請求 - 即使使用相同的 URL - 也可能在完全不同的線程中執行,因此 ThreadLocal 不是一種在請求之間保存狀態的機制。為此,可以使用 SessionBeans 之類的東西。

TA貢獻1827條經驗 獲得超9個贊
如果您在不是 100% 控制的線程中的 ThreadLocal 中放置了某些內容(即從其他代碼調用您的線程,例如 HTTP 請求),則需要在離開代碼之前清除您設置的任何內容。
A try
/finally
結構是一個很好的方法。
線程池無法為您做到這一點,因為 Java API 不提供清除線程ThreadLocal
變量的方法。(這可以說是Java API的一個缺點)
不這樣做會有內存泄漏的風險,盡管它受到線程池大小的限制(如果有的話)。
一旦同一線程再次分配給了解 的代碼ThreadLocal
,如果您沒有刪除它,您將看到上一個請求的舊值。依賴于此是不好的。它可能會導致難以追蹤的錯誤、安全漏洞等。
添加回答
舉報