ThreadLocal源碼剖析
ThreadLocal其實(shí)比較簡單降允,因?yàn)轭惱锞腿齻€public方法:set(T value)恩闻、get()、remove()拟糕。先剖析源碼清楚地知道ThreadLocal是干什么用的判呕、再使用、最后總結(jié)送滞,講解ThreadLocal采取這樣的思路侠草。
三個理論基礎(chǔ)
在剖析ThreadLocal源碼前,先講一下ThreadLocal的三個理論基礎(chǔ):
1犁嗅、每個線程都有一個自己的ThreadLocal.ThreadLocalMap對象
2边涕、每一個ThreadLocal對象都有一個循環(huán)計(jì)數(shù)器
3、ThreadLocal.get()取值褂微,就是根據(jù)當(dāng)前的線程功蜓,獲取線程中自己的ThreadLocal.ThreadLocalMap,然后在這個Map中根據(jù)第二點(diǎn)中循環(huán)計(jì)數(shù)器取得一個特定value值
ThreadLocal的原理簡單說應(yīng)該是這樣的:
ThreadLocal不需要key宠蚂,因?yàn)?b>線程里面自己的ThreadLocal.ThreadLocalMap不是通過鏈表法實(shí)現(xiàn)的式撼,而是通過開地址法實(shí)現(xiàn)的
每次set的時候往線程里面的ThreadLocal.ThreadLocalMap中的table數(shù)組某一個位置塞一個值,這個位置由ThreadLocal中的threadLocaltHashCode取模得到求厕,如果位置上有數(shù)據(jù)了著隆,就往后找一個沒有數(shù)據(jù)的位置
每次get的時候也一樣,根據(jù)ThreadLocal中的threadLocalHashCode取模呀癣,取得線程中的ThreadLocal.ThreadLocalMap中的table的一個位置美浦,看一下有沒有數(shù)據(jù),沒有就往下一個位置找
既然ThreadLocal沒有key项栏,那么一個ThreadLocal只能塞一種特定數(shù)據(jù)浦辨。如果想要往線程里面的ThreadLocal.ThreadLocalMap里的table不同位置塞數(shù)據(jù) ,比方說想塞三種String沼沈、一個Integer流酬、兩個Double、一個Date列另,請定義多個ThreadLocal康吵,ThreadLocal支持泛型"public class ThreadLocal<T>"。?
https://www.cnblogs.com/xrq730/p/4854820.html