ThreadLocal的原始碼實現分析

2021-10-09 14:34:50 字數 2937 閱讀 8160

threadlocal var = new threadlocal<>();

//當前執行緒作用

var.set(object)

var.get()

public

static threadlocal

var =

newthreadlocal

<

>()

;public

void

closure1()

throws interruptedexception

,"thread1");

thread1.

start()

; thread.

sleep

(2000l)

; string m1 = var.

get();

system.out.

println

(thread.

currentthread()

.getname()

+"\t取var值為:\t"

+m1+

"\n");

}

main	設定了var值

main 取var值為: main執行緒值

thread1 取var值為: null

thread1 設定了var值

thread1 取var值為: thread1執行緒值

thread1 執行緒結束了

main 取var值為: main執行緒值

測試**先定義了公共變數threadlocal,main執行緒先設定了值,獲取到main值。thread1嘗試獲取值。得到null,當thread1設定值後獲取到thread1值,當thread1執行緒結束後main執行緒仍然獲取到mian值,說明每個執行緒獲取到的值都是自己執行緒特有的

大致思路

static

class

threadlocalmap

private

static

intnextindex

(int i,

int len)

private

static

intprevindex

(int i,

int len)

threadlocalmap

(threadlocal<

?> firstkey, object firstvalue)..

....

public

class

thread

implements

runnable

//如果沒查到當前threadlocal說明沒有當前threadlocal

}//如果threadlocalmap未被初始化或者沒有當前threadlocal

return

this

.setinitialvalue()

;}public

void

set(t value)

else

}//設定初始化值

private t setinitialvalue()

elseif(

this

instanceof

terminatingthreadlocal

)return value;

}private

void

set(threadlocal<

?> key, object value)

//如果k不存在,則將hash值靠後存在的threadlocal換到hash值靠前的位置

//這一部主要是為了提高查詢效率

if(k == null)

}//將該threadlocal加入到threadlocalmap中

tab[i]

=new

threadlocal.threadlocalmap.entry

(key, value)

;int sz =

++this

.size;

//優化結構後大於等於2*len/3則rehashif(

!this

.cleansomeslots

(i, sz)

&& sz >=

this

.threshold)

}//替換沒用的threadlocal,提高查詢效率

private

void

replacestaleentry

(threadlocal<

?> key, object value,

int staleslot)

}//將後面不為空的值換到前面來

for(i =

nextindex

(staleslot, len)

;(e = tab[i]

)!= null; i =

nextindex

(i, len)

)this

.cleansomeslots

(this

.expungestaleentry

(slottoexpunge)

, len)

;return;}

if(k == null && slottoexpunge == staleslot)

}//將當前的threadlocal加入其中,並賦予初值,預設為null

void

createmap

(thread t, t firstvalue)

private

void

setthreshold

(int len)

ThreadLocal原始碼理解

threadlocal其實原理是建立了多份相同資料儲存在堆記憶體上,每個執行緒的thread類裡有threadlocal.threadlocalmap threadlocals的屬性來指向存位置,所以每個執行緒修改都不會影響到其他執行緒的資料 首先說下下面用到的東西 threadlocalmap為t...

ThreadLocal原始碼分析

在理解handler looper之前,先來說說threadlocal這個類,聽名字好像是乙個本地執行緒的意思,實際上它並不是乙個thread,而是提供乙個與執行緒有關的區域性變數功能,每個執行緒之間的資料互不影響。我們知道使用handler的時候,每個執行緒都需要有乙個looper物件,那麼and...

ThreadLocal 原始碼解讀

在正式讀 前先簡單介紹threadlocal的實現方式。每個執行緒都會有乙個threadlocalmap,只有在使用到threadlocal的時候才會初始化threadlocalmap。需要儲存的物件t會被放到entry裡面儲存在threadlocalmap的陣列中,entry是乙個鍵值對的資料結構...