具體如何使用,本章不關注。請自行百度。
關注核心方法 get() 和 set()
public class ThreadLocal<T> { //放 public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = t.threadLocals; if (map != null) { map.set(this, value); } else { t.threadLocals = new ThreadLocalMap(this, firstValue);//key爲當前的ThreadLocal變量,value爲要放入的值 } } 原文:https://blog.csdn.net/lan861698789/article/details/81323757 //取 public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = t.threadLocals; if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { return (T)e.value; } } return setInitialValue();//初始化爲null } } |
分析:
1).實際的通過ThreadLocal創建的副本是存儲在每個線程Thread自己的threadLocals中的;
在每個線程Thread內部有一個成員變量threadLocals,這個threadLocals就是用來存儲實際的變量副本的,鍵值爲當前ThreadLocal變量,value爲變量副本(即T類型的變量)。
2).爲何threadLocals的類型ThreadLocalMap的鍵值爲ThreadLocal對象,因爲每個線程中可有多個threadLocal變量,就像上面代碼中的longLocal和stringLocal;
原文:https://blog.csdn.net/lan861698789/article/details/81323757
重點:
這個threadLocals就是用來存儲實際的變量副本的,鍵值爲當前ThreadLocal變量,value爲變量副本(即T類型的變量)。
原文:https://blog.csdn.net/lan861698789/article/details/81323757
如果沒有ThreadLocal,我們自己怎麼實現呢?
1.需要Thread也爲我們創建一個Map
2.然後Thread.currentThread()得到這個map,然後put一個自定義N個key進去。如keyA。
3.取的時候,同樣拿到當前線程的map,然後get(keyA).