2012-01-04 2 views
1

Предполагая, что система содержит 2 потока. Один из них взаимодействует с ThreadLocal, а другой - нет.Неименованные ThreadLocals инициализируются?

Что происходит с ThreadLocal в классе, который не взаимодействует с ThreadLocal?

  1. Действительно ли он инициализирован?
  2. Это занимает память?

ответ

1

Будет только один объект ThreadLocal. Каждый поток имеет лениво инициализированную карту значений всех инициализированных объектов 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); 
} 
+0

Отличный ответ. Благодаря! – Gili

1

Из Javadoc:

protected T initialValue()

Этот метод будет вызван в первый раз, поток получает доступ к переменной с помощью метода Get(), если поток ранее не вызывается множество (Т), и в этом случае метод 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.

Смежные вопросы