Threadlocal爲每個使用該變量的線程提供獨立的變量副本。
使用的情況:對每一個線程都必須持有一個類的實例,而且這個類是可變的(不可變的就是線程安全的,全部線程使用一個就可以了),例如hibernate對session的處理。
問題場景:用戶登錄時,token保存在ThreadLocal裏,但是經常偶現 token失效(在tonken在有效時間裏)
產生原因:使用線程池或有複用線程時,複用同一個線程時,每次請求結束後ThreadLoca的值l沒有清空,導致第二次使用時ThreadLocal的token還是上次遺留一下的token,以致tonken失效。
tomcat默認使用線程池,所以一個線程的生命週期不能對等於一個請求的生命週期,線程池中的線程是可以被複用的。
解決方案:
1、保證每次都用新的值覆蓋線程變量;
2、保證在每個請求結束後清空線程變量。