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是乙個鍵值對的資料結構...