個人對threadlocal的理解

2021-10-24 18:21:58 字數 1269 閱讀 8072

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,將當前執行緒...