【STM32H7】第9章 RL-TCPnet除錯方法(Event Recorder和串列埠兩種)
阿新 • • 發佈:2020-09-08
要點
ThreadLocal是執行緒獨有的,執行緒之間隔離。
ThreadLocal在整個執行緒上下文中都可以獲得,可以避免參數的反覆傳遞。
ThreadLocal在用完之後要通過finally清除,否則如果執行緒複用,會遺留到下一次處理中。
get()
1 public T get() { 2 Thread t = Thread.currentThread(); 3 ThreadLocalMap map = getMap(t); 4 if (map != null) { 5 ThreadLocalMap.Entry e = map.getEntry(this); 6 if (e != null) { 7 @SuppressWarnings("unchecked") 8 T result = (T)e.value; 9 return result; 10 } 11 } 12 return setInitialValue(); 13 }
首先獲得當前執行緒的threadLocals變數(getMap(t)),這個變數的型別是ThreadLocal.ThreadLocalMap,可以看作是一個map,儲存著該執行緒所有ThreadLocal物件。
接下來判斷如果map不為空,則拿到map中所需的ThreadLocalMap.Entry(它是ThreadLocal弱引用的子類),如果Entry也不為空,則返回Entry的value,即實際儲存的物件。
如果兩次判斷有一個失敗了,則呼叫setInitialValue()進行初始化。
小結
可以看出來,ThreadLocal和ThreadLocal.ThreadLocalMap.Entry其實是對應關係,而中間經過了一個ThreadLocal.ThreadLocalMap的類似map的物件。
ThreadLocal的精妙之處
1.ThreadLocal通過每個執行緒獨立的ThreadLocalMap變數
2.經過這個ThreadLocalMap變數後,ThreadLocal實際轉換為其弱引用型別的子類Entry,可以實現每個Entry的自動清理:每個Entry隨著被get,被強引用,而當執行緒銷燬後,只剩下弱引用,Entry便會隨著下次GC被清理掉。
3.ThreadLocalMap底層是用一個Entry陣列存放Entry物件的,因為如果是Map形式存放會涉及到Node指標的問題,會存在強引用,不便於GC自動清理。