亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Spring Boot 中的線程本地行為

Spring Boot 中的線程本地行為

蕭十郎 2023-07-28 16:43:47
我們知道 Tomcat 有大約 200 個線程,而 Jetty 在各自的線程池中有一些默認計數的線程。因此,如果我們在ThreadLocal每個請求中設置一些內容,它會在線程中終生存在,還是 TomcatThreadLocal在每個請求后清除它。如果我們在過濾器中的 userContext 中設置某些內容,是否需要在每次過濾器退出時清除它?或者如果我們沒有線程池配置,Web 服務器是否每次都會創建一個新線程?public static final ThreadLocal<UserContextDto> userContext = new ThreadLocal<>();
查看完整描述

3 回答

?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

是的,你需要清除ThreadLocal。Tomcat 不會清除 ThreadLocals。

不,并不是每次都會創建新線程。池中的線程用于服務請求,并在請求完成后返回池。

這不僅適用于 Tomcat,也適用于 Jetty 和 Undertow。為每個請求創建線程在資源和時間方面都是昂貴的。


查看完整回答
反對 回復 2023-07-28
?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

不,Tomcat 不會清除您的代碼創建的 ThreadLocals,這意味著它們將保留并可能污染后續請求。

因此,每當您創建一個請求時,請確保在同一請求或任何其他請求存在之前將其清除。

還應該注意的是,后續請求 - 即使使用相同的 URL - 也可能在完全不同的線程中執行,因此 ThreadLocal 不是一種在請求之間保存狀態的機制。為此,可以使用 SessionBeans 之類的東西。



查看完整回答
反對 回復 2023-07-28
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

如果您在不是 100% 控制的線程中的 ThreadLocal 中放置了某些內容(即從其他代碼調用您的線程,例如 HTTP 請求),則需要在離開代碼之前清除您設置的任何內容。

try/finally結構是一個很好的方法。

線程池無法為您做到這一點,因為 Java API 不提供清除線程ThreadLocal變量的方法。(這可以說是Java API的一個缺點)

不這樣做會有內存泄漏的風險,盡管它受到線程池大小的限制(如果有的話)。

一旦同一線程再次分配給了解 的代碼ThreadLocal,如果您沒有刪除它,您將看到上一個請求的舊值。依賴于此是不好的。它可能會導致難以追蹤的錯誤、安全漏洞等。


查看完整回答
反對 回復 2023-07-28
  • 3 回答
  • 0 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號