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