未引用的ThreadLocals是否被初始化?

时间:2012-01-04 16:17:57

标签: java thread-local

假设系统包含2个线程。其中一个与ThreadLocal交互,而另一个则没有。

ThreadLocal在不与ThreadLocal交互的类中会发生什么?

  1. 是否已初始化?
  2. 是否会占用任何记忆?

3 个答案:

答案 0 :(得分:1)

来自Javadoc

  

protected T initialValue()

     

当线程第一次使用get()方法访问变量时,将调用此方法,除非线程先前调用了set(T)方法,在这种情况下,不会为线程调用initialValue方法。通常,每个线程最多调用一次此方法,但如果后续调用remove()后跟get(),则可以再次调用此方法。

这表明ThreadLocal仅针对与其交互的线程进行初始化。

关于你的第二个问题(它是否耗尽了任何资源),答案很可能取决于操作系统。

答案 1 :(得分: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实例中初始化。

答案 2 :(得分:1)

只有一个ThreadLocal对象。每个Thread都有一个懒惰的初始化的所有初始化ThreadLocal对象的值映射。这意味着只有第一个Thread会有一个带有一个值的额外Map对象,并且第二个线程没有任何改变。

有关详细信息,请参阅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);
}