ThreadLocal遇到線程池時, 各線程間的數據會互相干擾

1、問題現象

在一個服務中,我們爲了不修改接口,且能在當前線程傳遞數據,想到了用ThreadLocal保存數據, 測試環境一切正常, 上生產環境後發現,當前線程去ThreadLocal保存的用戶數據的時候,莫名其妙的取到了,其它用戶的數據。

2、問題原因

首先我排查了ThreadLocal 中存、取數據的過程,沒有線程安全的問題, 然後懷疑是項目中用了線程池複用線程導致數據混亂,排查後發現項目中並沒使用線程池。 然後繼續排查發現 Tomcat 中採用線程池技術導致的,當前線程ThreadLocal數據未釋放的時候,又被其它請求複用了,從而導致ThreadLocal數據混亂。
下圖爲tomcat配合線程池內容:
在這裏插入圖片描述

3、解決方案

1)在每次使用ThreadLocal來進行存儲數據的時候,先進行賦值操作,即是校驗或者其他操作沒有成功,最起碼需要一個默認的賦值。記得在使用的時候進行判斷。
2)可以在調用的finally裏面使用remove。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章