ThreadLocal總結 jdk1 8原始碼

2022-09-05 00:54:16 字數 2327 閱讀 5034

threadlocal為每個使用它的執行緒提供乙個變數的副本。

threadlocal中的主要方法:

public void set(t value)

public

void

set(t value)

先呼叫thread類的靜態方法獲得當前執行緒的thread物件,每個執行緒對應的thread物件都有乙個threadlocalmap物件的引用,如下。

threadlocal.threadlocalmap threadlocals = null;     //

thread類中

然後獲得當前執行緒的threadlocalmap物件

threadlocalmap getmap(thread t)

如果不為空就呼叫set方法,如果為空就呼叫createmap方法,傳入引數為threadlocalmap為空的thread物件,和t型別的firstvalue

void

createmap(thread t, t firstvalue)

使用threadlocalmap的過載構造器,構造thread物件的threadlocalmap,傳入引數為當前的threadlocal物件,和firstvalue

private

static

final

int initial_capacity = 16; //

threadlocalmap中定義的

private

final

int threadlocalhashcode = nexthashcode(); //

threadlocal中定義的

threadlocalmap(threadlocal<?>firstkey, object firstvalue)

i為threadlocal物件的雜湊值和entry陣列的大小-1的二進位制值(1111)的操作結果,這樣能保證儲存在陣列的每乙個位置的概率相同。

建立乙個entry(鍵值對)陣列,存放下標為threadlocal物件的雜湊值和1111的與操作結果,存放物件的鍵為threadlocal物件,值為firstvalue即set的值

firstvalue物件儲存在threadlocalmap物件維護的entry型別陣列 table內,下標為threadlocal物件和1111的與運算結果,entry的key為threadlocal物件

2.public object get()方法:該方法返回當前執行緒所對應的執行緒區域性變數

public

t get()

}return

setinitialvalue();

}

get方法,先獲取當前執行緒的thread物件,再獲取thread物件的threadlocalmap物件,然後根據當前的threadlocal物件取得table陣列對應下標的entry物件(因為儲存的時候就是根據當前的threadloca物件的hash值儲存的)

private entry getentry(threadlocal<?>key)

最後如果thread物件的threadlocalmap為空的話,就呼叫setinitialvalue方法,該方法初始化map並且放入null ( initialvalue的返回值為null ),可以通過覆蓋該方法修改沒有set的時候的初始值

private

t setinitialvalue()

3.public void remove()方法

public

void

remove()

threadlocal的remove方法先獲取當前執行緒的map物件,然後呼叫map的remove方法,刪除entry

總結:

對於非執行緒安全的變數可以將它封裝進threadlocal中,在呼叫的時候不是直接引用而是使用threadlocal的set和get方法

執行緒呼叫set方法:

放入當前執行緒的threadlocalmap中,key為threadlocal的hashcode

聊聊ThreadLocal原始碼 基於JDK1 8

原文 主要方法 public t get return setinitialvalue public void set t value 下面 時樓主認為threadlocal中比較重要的,還是比較容易看懂的,就不在一一細說 public class threadlocal 除非執行緒先前呼叫了方法,...

ThreadLocal學習總結

public class threadlocaltest 測試threadlocal system.out.println threadlocal.get 學習threadlocal,首先先從它的資料結構開始,threadlocal的內部類threadlocalmap 只是擷取部分 static c...

ThreadLocal引起記憶體洩露總結

我們都知道threadlocal能給每乙個執行緒建立乙個副本,確保多個執行緒訪問資源的安全性。但是threadlocal使用不當會造成記憶體洩漏。首先分析一下threadlocal記憶體洩漏原理。threadlocal底層其實是乙個threadlocalmap,是以形式儲存變數副本的。但是由於key...