31 執行緒區域性變數 ThreadLocal

2021-09-02 23:24:34 字數 2012 閱讀 6718

執行緒區域性變數 threadlocal

原理,作用

每個thread維護乙個threadlocalmap 對映表,使用threadlocal物件為弱引用的map集合(即弱引用的物件可以在gc中被**掉),value為對應的值。其生命週期和執行緒一致。

用法

initialvalue():

當get()方法為null時,內部執行開始呼叫initialvalue()方法;當執行完remove()方法,在下一次呼叫get()方法(獲取的為null)時,內部執行開始呼叫initialvalue()方法。

原始碼分析

get(): 獲取threadlocal中當前執行緒共享變數的值。

原始碼分析

set(t): 設定threadlocal中當前執行緒共享變數的值。

原始碼分析

remove(): 移除threadlocal中當前執行緒共享變數的值。

原始碼分析

案例

弱引用

弱引用導致的記憶體洩露

當執行緒沒有結束,但是threadlocal已經被**,則可能導致執行緒中存在threadlocalmap的鍵值對。如果執行緒遲遲不能結束,則key為null的entry的value不能被**掉。

雖然其get(),set(),remove()在呼叫的時候,會自動清除執行緒threadlocalmap裡所有key為null的value,但不能確保不會發生記憶體洩露。

使用弱引用的原因

如果key 使用強引用,在引用的threadlocal的物件被**時,由於threadlocalmap持有threadlocal的強引用;如果沒有手動刪除,threadlocal不會被**,導致entry記憶體洩漏;

而採用弱引用,在在引用的threadlocal的物件被**時,可自動**threadlocal。

記憶體洩露的處理方法

1、使用完執行緒共享變數後,顯示呼叫threadlocalmap.remove方法清除執行緒共享變數;

2、jdk建議threadlocal定義為private static,這樣threadlocal的弱引用問題則不存在了。

DLL 執行緒區域性變數

1.用 declspec thread 建立執行緒區域性變數 declspec thread int tls count 0 注意事項 當用 declspec thread 宣告執行緒區域性變數的時候,應注意以下事項 1 只能用來宣告或者定義具有static作用域的變數,而不能用來宣告或者定義區域性...

多執行緒 執行緒內區域性變數

該類提供了執行緒內區域性 thread local 變數。好比有兩個視窗 兩個執行緒 乙個視窗可以拿飲料,乙個視窗可以拿食物。現在有多個人要來拿東西,如果在飲料視窗有的人拿到了飲料,有的人拿到了不該拿的食物,就說明執行緒之間出現了混亂,我們應當避免這種情況出現。以下 就可能會出現執行緒混亂的問題 p...

ThreadLocal執行緒區域性變數 多執行緒與高併發

threadlocal執行緒區域性變數,實現了將物件變數儲存在特定的執行緒物件中,僅對當前執行緒可見。我們在測試程式中,乙個執行緒往threadlocal物件中放置物件,然後另乙個物件來取物件取不到。public class testthreadlocal catch interruptedexce...