threadlocal,即執行緒區域性變數,其實就是乙個容器,每個執行緒都可通過其set方法儲存乙份資料,並且在get時只會獲取自己執行緒的資料,是常用的實現執行緒安全的方式。
自己用過許多次了,但沒有細究其原理,今天大概看了一下原始碼,算是明白了一點點0.0
直接看threadlocal的get方法
public t get()
}return
setinitialvalue()
;}
首先就找到當前執行緒物件,然後根據當前執行緒物件呼叫getmap方法。果然還是要用map來儲存資料的,只不過這個map並不是我們常用的hashmap之類,而是threadlocal的乙個靜態內部類:threadlocalmap。
getmap方法最終返回的是執行緒物件的乙個threadlocalmap屬性
threadlocalmap getmap
(thread t)
thead類屬性:
threadlocal.threadlocalmap threadlocals = null;
也就是說這個map是被thread物件直接引用的,現在大概明白了為什麼不同執行緒能夠獲取不同的資料,原因就是每個執行緒都有乙份自己的threadlocalmap
接下來就看看threadlocalmap大致**
static
class
threadlocalmap
}private
static
final
int initial_capacity =16;
private entry[
] table;
private entry getentry
(threadlocal<
?> key)
可以看到threadlocalmap中的entry繼承了weakreference,意思就是儲存的是以threadlocal為鍵(該鍵為弱引用,這裡也是記憶體洩漏的隱患地),object為值的資料,用乙個entry陣列來儲存多組資料,初始大小為16
但是為何會以threadlocal為鍵呢?其實不難理解,每個執行緒物件有自己的threadlocalmap屬性,當乙個執行緒中呼叫threadlocal物件.get()方法時,會根據當前執行緒物件找到其引用的threadlocalmap物件,然後呼叫map的getentry()方法獲取對應資料。
但我們的**中不可能永遠只有乙個threadlocal物件,我們完全有可能定義乙個threadlocal< string >來儲存執行緒對應的字串,定義乙個threadlocal< integer >來儲存執行緒對應的數值…多個threadlocal物件呼叫get()時均找到當前執行緒的threadlocalmap物件,他們如何在entry陣列中找到自己想要的資料呢?這時就應以threadlocal物件作為區分,取出不同的值
看到這裡其實懂了大概原理了,具體以後慢慢看吧。。。
ThreadLocal底層實現原理
解釋的不錯的一片文章 下邊是個人理解,如果有錯誤還請批評指正 首先說一下使用方式 threadlocalthreadlocala new threadlocal threadlocalthreadlocalb new threadlocal 存入 執行緒1 threadlocala.set aaa ...
ThreadLocal實現原理簡述
threadlocal是乙個執行緒內共享變數工具類。將執行緒與該執行緒存放的物件做乙個對映,各個執行緒之間的變數互不干擾。適用於各個執行緒依賴不同的變數值完成操作的場景,如 spring宣告式資料庫事務 shiro的session threadlocal內部結構 核心機制 1.每個執行緒例項中有個t...
ThreadLocal的作用和實現原理
threadlocal是乙個執行緒內部的資料儲存類,通過它可以在指定的執行緒中儲存資料,資料儲存以後,只有在指定的執行緒中可以獲取到儲存的資料,對於其他執行緒來說則無法取到資料。threadlocal的主要作用 輕鬆實現一些看起來很複雜的功能,適合以下一些應用場景。某些資料是以執行緒為作用域並且不同...