2012-01-04 54 views
1

假設系統包含2個線程。其中一個與ThreadLocal交互,而另一個則沒有。未引用的ThreadLocals是否已初始化?

發生的ThreadLocal在不使用ThreadLocal的互動類是什麼?

  1. 是它曾經初始化?
  2. 它是否佔用任何內存?

回答

1

將只有一個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); 
} 
+0

出色答卷。謝謝! – Gili 2012-01-04 19:40:16

1

Javadoc

protected T initialValue()

該方法將被調用的第一次一個線程訪問與get()方法的變量,除非線程先前調用的集合(T )方法,在這種情況下,不會爲該線程調用initialValue方法。通常,每個線程最多調用一次此方法,但在後續調用remove()後再調用get()時,可能會再次調用此方法。

這表明ThreadLocal只爲與它進行交互的線程進行初始化。

至於你的第二個問題(它是否耗盡了任何資源),答案可能取決於操作系統。

1

根據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實例中初始化。