ThreadLocal是線程局部變量,,其中保存了特定于該線程的值.每個(gè)線程都擁有一份獨(dú)立的副本值,,即每個(gè)線程修改變量值不影響其他線程該變量的副本值.這些特定于線程的值保存在Thread對(duì)象中,,當(dāng)線程終止后,這些值會(huì)作為垃圾回收. 散列每次創(chuàng)建的ThreadLocal都有唯一的hashCode值,,根據(jù)這個(gè)值hashCode可以計(jì)算變量在散列表中對(duì)應(yīng)的地址.ThreadLocalMap的hash函數(shù)方法是將hashCode值和散列表容量大小進(jìn)行與操作得到變量對(duì)應(yīng)的位置.
沖突解決在散列表中會(huì)存在地址沖突問(wèn)題,,即對(duì)于不同的hashCode可能會(huì)計(jì)算得到相同地址.對(duì)于這種情況,ThreadLocalMap采用了最簡(jiǎn)單的沖突解決方案---從沖突發(fā)生的地址d開始,,依次探測(cè)d的下一個(gè)地址,,直到找到一個(gè)空閑單元為止. 裝填因子ThreadLocalMap 設(shè)置的裝填因子為2/3,當(dāng)變量個(gè)數(shù)大于2/3時(shí)擴(kuò)大容器容量再散列. get和setThreadLocal的定義和使用比較簡(jiǎn)單,,只要聲明一個(gè)ThreadLocal變量,那該變量就為每個(gè)線程都分配了一個(gè)副本.通過(guò)set和get方法設(shè)置和獲取該線程局部變量值:
對(duì)于以上的set和get方法的實(shí)現(xiàn)思路也比較簡(jiǎn)單.在set方法中,,首先查看當(dāng)前線程是否初始化了散列表,,如果沒(méi)有則創(chuàng)建一個(gè)散列表(初始化容器大小為16).如果存在則根據(jù)hashCode計(jì)算變量在散列表的地址并設(shè)置值.
get方法和set方法相似,如果散列表不存在時(shí)則創(chuàng)建一個(gè)散列表并設(shè)置初始值.
|
|
來(lái)自: 昵稱10504424 > 《工作》