1. 程式人生 > 實用技巧 >【STM32H7】第9章 RL-TCPnet除錯方法(Event Recorder和串列埠兩種)

【STM32H7】第9章 RL-TCPnet除錯方法(Event Recorder和串列埠兩種)

要點

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變數

,實現了每個執行緒的Entry的獨立。

2.經過這個ThreadLocalMap變數後,ThreadLocal實際轉換為其弱引用型別的子類Entry,可以實現每個Entry的自動清理:每個Entry隨著被get,被強引用,而當執行緒銷燬後,只剩下弱引用,Entry便會隨著下次GC被清理掉。

3.ThreadLocalMap底層是用一個Entry陣列存放Entry物件的,因為如果是Map形式存放會涉及到Node指標的問題,會存在強引用,不便於GC自動清理。