ThreadLocal原始碼簡單解析
阿新 • • 發佈:2019-01-23
ThreadLocal
ThreadLocal我一開始接觸的時候,以為是“本地執行緒”搞的我雲裡霧裡的,看了內部實現後,這個Local應該稱為“區域性”。
在《多執行緒併發程式設計實戰》提到:維持執行緒封閉性的一種規範方法,這個類為每個使用該變數的執行緒都存有一份獨立的副本。
問題-解析
為每個使用該變數的執行緒都存有一份獨立的副本? 這是怎麼實現的呢?
ThreadLocal並非執行緒,而是一個執行緒的區域性變數。準確的來說ThreadLocalMap是執行緒的一個區域性變數,而ThreadLocal包裝了一些方法。
//ThreadLocalMap會根據TheadLocal得到table[i]中的Entry(簡略的拉鍊法Map),Entry存放的就是key和value。
//整個流程就是ThreadLocal根據Thread得到當前執行緒中的區域性變數ThreadLocalMap(這也是為什麼每個使用這個變數都有一份獨立的副本的緣故),然後在ThreadLocal中再通過this得到存放在Map中的Entry(多份ThreadLocal不會衝突的原因)。ThreadLocal中的get,set其實都是對執行緒本身中的變數進行操作。
見原始碼(主要看get()和set()):