線程複用時Threadlocal需要注意的地方

 

Threadlocal爲每個使用該變量的線程提供獨立的變量副本。

使用的情況:對每一個線程都必須持有一個類的實例,而且這個類是可變的(不可變的就是線程安全的,全部線程使用一個就可以了),例如hibernate對session的處理。

 

問題場景:用戶登錄時,token保存在ThreadLocal裏,但是經常偶現 token失效(在tonken在有效時間裏)

產生原因:使用線程池或有複用線程時,複用同一個線程時,每次請求結束後ThreadLoca的值l沒有清空,導致第二次使用時ThreadLocal的token還是上次遺留一下的token,以致tonken失效。

 

tomcat默認使用線程池,所以一個線程的生命週期不能對等於一個請求的生命週期,線程池中的線程是可以被複用的。

解決方案:

1、保證每次都用新的值覆蓋線程變量;

2、保證在每個請求結束後清空線程變量。

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