經過 ThreadLocal 能數據保存在一個線程中,並且不須要 lock 同步。理論上 ThreadLocal 可數組
以讓一個變量在每一個線程都有一個副本。 ThreadLocal 經常使用來屏蔽線程的私有變量,例如「並this
發事務」或者其餘的資源。並且,它還被用來維護每一個線程的計數器,統計,或者 ID 生成spa
器。線程
由ThreadLocal經常使用的get方法定義看:索引
public T get() {事務
Thread t = Thread.currentThread();資源
ThreadLocalMap map = getMap(t);get
if (map != null) {同步
ThreadLocalMap.Entry e = map.getEntry(this);it
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
能夠知道,每一個Thread內部都有一個ThreadLocal.ThreadLocalMap threadLocals;這個map的維護是由ThreadLocal表現.並且它的初始化是lazily.
每一個ThreadLocal當前的nextHashCode的生成,以及它在ThreadLocalMap內部數組的索引的生成能夠看源代碼.