首先聲明,ThreadLocal不是用來(lái)解決共享變量問(wèn)題的硅卢,而是在不同的是線程中存放該線程自身的變量(eg: session武通,每個(gè)線程都可以有一個(gè)session變量畔勤,但是每個(gè)線程的session變量指向的對(duì)象不一樣,可以看做都是ThreadLocal變量蕊温,但是該ThreadLocal變量在不同的線程可能有不同的值)袱箱。
這個(gè)看源碼就清楚了:
首先是獲取當(dāng)前線程的ThreadLocalMap對(duì)象,然后以當(dāng)前的ThreadLocal對(duì)象為鍵义矛,需要設(shè)置的value為值发笔。ThreadLocalMap為ThreadLocal的一個(gè)內(nèi)部類,是Thread的一個(gè)屬性凉翻。為什么需要用一個(gè)map來(lái)存呢了讨?因?yàn)橐粋€(gè)線程可以有多個(gè)ThreadLocal變量,這些ThreadLocal變量都存放在ThreadLocalMap對(duì)象中,當(dāng)線程要使用某個(gè)ThreadLocal變量時(shí)前计,通過(guò)ThreadLocal#get方法獲取本ThreadLocal變量在本線程的值
比如說(shuō)有兩個(gè)ThreadLocal變量:tl1,tl2胞谭;有兩個(gè)Thread:t1,t2;
在線程t1中設(shè)值:tl1.set(1),tl2.set("t1")
在線程t2中設(shè)值:tl1.set(2),tl2.set("t2")
獲取值:
線程t1:tl1.get() -> 1 ;tl2.get() -> "t1"
線程t2:tl1.get() -> 2 ;tl2.get() -> "t2"