Получают ли инициализированные не связанные ссылки ThreadLocals? - PullRequest
1 голос
/ 04 января 2012

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

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

  1. Это когда-нибудь инициализируется?
  2. Это занимает какую-то память?

Ответы [ 3 ]

1 голос
/ 04 января 2012

Из 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.

1 голос
/ 04 января 2012

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

Из Javadoc :

protected T initialValue()

Этот метод будет вызываться при первом обращении потока к переменной с помощью метода get (), если только поток ранее не вызывал метод set (T), и в этом случае метод initialValue не будет вызываться для потока. Обычно этот метод вызывается не более одного раза для каждого потока, но он может быть вызван снова в случае последующих вызовов remove (), за которыми следует get ().

Это говорит о том, что ThreadLocal инициализируется только для потоков, которые взаимодействуют с ним.

Что касается вашего второго вопроса (использует ли он какие-либо ресурсы), то ответ, скорее всего, будет зависеть от ОС.

...