線程複用時Threadlocal的坑

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

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

 

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

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

 

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

解決方案:token

一、保證每次都用新的值覆蓋線程變量;生命週期

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

相關文章
相關標籤/搜索