ThreadLocal如何保證獲取到想要執行緒變數
阿新 • • 發佈:2019-02-19
首先ThreadLocal並不會儲存資料,它做的只是做獲取和存放這些過程.資料本身並沒有存在ThreadLocal中.
那麼問題來了,資料到底存放在哪裡?
存放在當前執行緒中即Thread中的ThreadLocalMap中.
那麼ThreadLocalMap又是什麼?
ThreadLocal的內部類.....
好玩嗎....並不好玩....貼程式碼吧
這是ThreadLocal中的儲存資料的方法,程式碼解析:
1.第一部獲取當前執行緒;
2.通過當前執行緒獲取map,從此可以看出map是與當前執行緒相關的是吧,此處的map儲存線上程中
3.儲存資料,盡然叫做map,我們大概的估計下可能資料介面有些類似map,key不能相同(其實就是這樣的ThreadLocalMap資料結構就是一個Entry陣列),由此你看出了什麼.....即:
- 一個ThreadLocal在一個執行緒中只能儲存一個變數值;
- 如果你想獲得之前線上程儲存的變數,你得保證你的ThreadLocal是個單例;
4.字面意思是建立一個執行緒的map,事實就是這樣
那麼ThreadLocal 是執行緒安全的嗎?
一般意義上講ThreadLocal是執行緒安全的,因為你操作的只是你自己的執行緒變數....
在其他執行緒中可不可以獲取當前執行緒變數?
可以...你可以通過反射機制,加上執行緒物件...你操作操作...這下就不安全啦...