ThreadLocal深入理解

2021-06-22 22:53:46 字數 2173 閱讀 6256

threadlocal從字面上理解,很容易會把threadlocal誤解為乙個執行緒的本地變數。threadlocal並不是代表當前執行緒,threadlocal其實是採用雜湊表的方式來為每個執行緒都提供乙個變數的副本。從而保證各個執行緒間資料安全。每個執行緒的資料不會被另外執行緒訪問和破壞。每個執行緒都擁有乙個自己的threadlocalmap物件,而這個物件的key是threadlocal型別的,這個key在每個執行緒中都是一樣的,threadlocal只是作為乙個索引。之所以有執行緒區域性變數這一說,是因為每個執行緒的threadlocalmap物件不同,那threadlocal型別的key當然可以指向不同物件了。

1 threadlocalmap只是threadlocal的乙個靜態內部類,而在該靜態內部類裡面又有乙個靜態內部類entry,建立乙個threadlocalmap ,需要兩個引數,乙個是threadlocal物件,作為key,乙個是value,作為值。可以通過key來查到value

public class threadlocal

}threadlocalmap(threadlocal firstkey, object firstvalue)

2  每乙個thread類裡面都會有乙個threadlocalmap的屬性物件,該map用來儲存value,這樣每乙個thread物件就會有乙個自己的value,而不與其他執行緒衝突。當然前提是該value不是多執行緒共享的物件,而是區域性物件,如果是多執行緒共享物件,依然會有執行緒共享問題,用threadlocal解決問題的關鍵是threadlocalmap儲存的物件是非共享物件,這樣才會每個執行緒有自己的物件,修改這個物件不對其他執行緒造成困擾。

public  class thread implements runnable

public t get()

return setinitialvalue();

}通過原始碼,我們可以發現,threadlocal的get方法是從每個執行緒的threadlocalmap物件去獲取value,其中threadlocal是作為key。set是把value放到threadlocalmap中去。

4  threadlocal能實現各個執行緒用到各自的value而不對其他執行緒造成衝突,是因為每乙個執行緒物件有乙個自己threadlocalmap,該map是以threadlocal作為key,來儲存和獲取value,當然前提不衝突是必須儲存的value不能是多執行緒共享物件。

5 threadlocal和synchonized都用於解決多執行緒併發訪問。但是threadlocal與synchronized有本質的區別。synchronized是利用鎖的機制,使變數或**塊在某一時該只能被乙個執行緒訪問。而threadlocal為每乙個執行緒都提供了變數的副本,使得每個執行緒在某一時間訪問到的並不是同乙個物件,這樣就隔離了多個執行緒對資料的資料共享。而synchronized卻正好相反,它用於在多個執行緒間通訊時能夠獲得資料共享。

synchronized用於執行緒間的資料共享,而threadlocal則用於執行緒間的資料隔離。

以下是hibernate對於threadlocal的運用片段:

private static final threadlocal threadsession = new threadlocal(); 

public static session getsession() throws infrastructureexception  

} catch (hibernateexception ex)  

return s; 

} 每個執行緒有自己的threadlocalmap,每個threadlocalmap中根據需要初始載入threadsession,這樣的好處就是介於singleton與prototype之間,應用singleton無法解決執行緒,應用prototype開銷又太大,有了threadlocal之後就好了,對於需要執行緒「霸佔」的變數用threadlocal,而該類例項的方法均可以共享。

最後threadlocal是相對於每個執行緒,每個執行緒會有自己的threadlocal。但是一般的應用伺服器都會維護一套執行緒池。因此,不同使用者訪問,可能會接受到同樣的執行緒。因此,在做基於theadlocal時,需要謹慎,避免出現threadlocal變數的快取,導致其他執行緒訪問到本執行緒變數。比如在jboss中,就有執行緒池,執行緒並不是處理完就銷毀的,而是放回池裡重用。所以,在你處理完一次request-response的時候,一定不要忘了手動刪除threadlocal裡的變數,也就是說手動呼叫一次threadlocalvar.remove()。  

ThreadLocal深入理解

通過每個執行緒維護一張threadlocalmap雜湊對映表,key為threadlocal的弱引用,value是object本身。也就是說,threadlocal本身不存任何實際值,而是通過本身作為key,從threadlocalmap中獲取具體的值。實際上,threadlocalmap儲存的是e...

深入理解ThreadLocal

threadlocal例項為每乙個訪問它的執行緒 即當前執行緒 都關聯了乙個該執行緒的執行緒特有物件 執行緒特有物件 tso,thread specific object 各個執行緒建立各自的例項,乙個例項只能被乙個執行緒訪問的物件就被稱為執行緒特有物件,相對應的執行緒就被稱為該執行緒特有物件的持有...

深入理解threadlocal

threadlocal,很多地方叫做執行緒本地變數,也有些地方叫做執行緒本地儲存,其實意思差不多。可能很多朋友都知道threadlocal為變數在每個執行緒中都建立了乙個副本,那麼每個執行緒可以訪問自己內部的副本變數。這句話從字面上看起來很容易理解,但是真正理解並不是那麼容易。我們還是先來看乙個例子...