簡述
一種線程綁定機制,每個線程都擁有對象的獨立副本,不會與其他線程沖突,從而避免了并發與同步問題。
結構
ThreadLocal結構.png
每個線程都有一個ThreadLocalMap,其中Key為ThreadLocal對象,Value為用戶對象的值
****ThreadLocal只是作為Key標識,并不存放任何數據,真正存放數據的是每個線程中的ThreadLocalMap。所以ThreadLocal一般應該定義成靜態變量。****
也不是一般人認為的Key是線程的名字或者標識
實現
public class ThreadLocal<T> {
public T get() {
// 獲取當前線程
Thread t = Thread.currentThread();
// 從當前線程中獲取ThreadLocalMap變量
ThreadLocalMap map = getMap(t);
if (map != null) {
// 以當前的ThreadLocal對象作為Key,從Map中獲取對應的值
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
}
public class Thread implements Runnable {
// 每個線程都有一個ThreadLocalMap對象
ThreadLocal.ThreadLocalMap threadLocals = null;
}
應用
避免同步或每次使用都創建新對象
針對Random、DateFormatter等非線程安全類,實現每個線程一個對象
數據庫連接等資源限制類,實現每個線程一個連接線程內跨方法的數據傳遞
例如Hibernate的Session綁定(實現延遲加載和事務處理,保證整個處理過程使用同一個session)