假設系統包含2個線程。其中一個與ThreadLocal交互,而另一個則沒有。未引用的ThreadLocals是否已初始化?
發生的ThreadLocal在不使用ThreadLocal的互動類是什麼?
- 是它曾經初始化?
- 它是否佔用任何內存?
假設系統包含2個線程。其中一個與ThreadLocal交互,而另一個則沒有。未引用的ThreadLocals是否已初始化?
發生的ThreadLocal在不使用ThreadLocal的互動類是什麼?
將只有一個ThreadLocal對象。每個線程都有一個懶惰初始化的所有初始化的ThreadLocal對象的值映射。這意味着只有第一個線程將有一個額外的地圖對象與一個值,並沒有什麼會改變第二個線程。
見ThreadLocal.setInitialValue()的詳細信息:
private T setInitialValue() {
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
return value;
}
和ThreadLocal.set():
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
從Javadoc:
protected T initialValue()
該方法將被調用的第一次一個線程訪問與get()方法的變量,除非線程先前調用的集合(T )方法,在這種情況下,不會爲該線程調用initialValue方法。通常,每個線程最多調用一次此方法,但在後續調用remove()後再調用get()時,可能會再次調用此方法。
這表明ThreadLocal只爲與它進行交互的線程進行初始化。
至於你的第二個問題(它是否耗盡了任何資源),答案可能取決於操作系統。
根據JavaDoc:
each thread that accesses one (via its get or set method) has its own,
independently initialized copy of the variable.
每個Thread
實例(從Thread.currentThread()
)持有地圖上ThreadLocal
對象它與之交互的。它有一個字段threadLocals
,這些實例中的每一個都在Thread
實例中初始化。
出色答卷。謝謝! – Gili 2012-01-04 19:40:16