threadlocal它操作的是當前執行緒的區域性變數
public void set(t value)
public t get()
}return setinitialvalue();
}public void remove()
上面是threadlocal的get()
和set()
方法的原始碼,可以看到threadlocal是將值存放在threadlocalmap中。其實在每個執行緒中都維護著乙個threadlocals變數(threadlocalmap型別),當使用set()
方法的時候實際上是將值存在當前執行緒的threadlocals中的,呼叫get()
方法也是從當前執行緒中取值的,這樣就做到了執行緒間的隔離。
其資料結構如下:
注意:使用threadlocal請務必remove!!!
使用threadlocal沒有remove,可能會導致
1記憶體溢位,threadlocal依賴沒有釋放,無法gc。
2執行緒池的某個執行緒會被反覆使用,threadlocal的生命週期不等於一次request的生命週期,造成獲取threadlocal內資料異常。
但有一點需要特別注意,那就是web容器的執行緒是重複使用的,web容器使用了執行緒池,當乙個請求使用完某個執行緒,該執行緒會放回執行緒池被其它請求使用,這就導致乙個問題,不同的請求還是有可能會使用到同乙個執行緒(只要請求數量大於執行緒數量),而threadlocal是屬於執行緒的,
如果我們使用完threadlocal物件而沒有手動刪掉,那麼後面的請求就有機會使用到被使用過的threadlocal物件!
這時候分情況考慮了:
1此請求在使用threadlocal的時候,是先get()來判斷然後再set(),那就會有問題。因為get到的是別的請求set的內容,
2此請求在使用threadlocal,都是先set再get,那就不會有問題,因為乙個執行緒同一時刻只被乙個請求使用,只要我們每次使用之前,都設定成自己想要的內容,那就不會在使用的過程中被覆蓋。
使用threadlocal最好是每次使用完就呼叫remove方法,將其刪掉,避免先get後set的情況導致業務的錯誤。
第二點,不remove的話容易造成堆疊記憶體溢位。
參考:
ThreadLocal的個人理解
threadlocal的設計思想十分簡單,它的核心物件就是threadlocalmap,被宣告在thread類裡面,每個thread都持有乙個threadlocalmap,所以才能實現執行緒隔離,以達到儲存共享變數的作用 threadlocal.threadlocalmap threadlocals...
ThreadLocal個人理解
為了加深理解,將最近對threadlocal的了解和原始碼分析記錄總結一下。threadlocal可以為執行緒提供區域性變數。使用threadlocal的get 方法,可以在當前執行緒能夠訪問的類和方法中,得與當前執行緒相關聯的變數值。不過,執行緒區域性變數並不是由threadlocal物件儲存維護...
ThreadLocal個人理解
每乙個thread物件中有乙個threadlocalmap的map屬性 該map的key是乙個弱引用 key被weakreference物件指向 當gc時就會 該entry就會 map屬性,避免了記憶體洩漏 當使用threadlocal時,當threadlocal屬性作為map的key,將當前執行緒...