Влияние ThreadLocals и параллельной загрузки классов - PullRequest
4 голосов
/ 16 февраля 2011

Предполагая,

class A{
         private static final ThreadLocal<String> tl = new ThreadLocal<String>();
}

Если A загружен только в один загрузчик классов в vm, значение t1 очевидно.Но что происходит с t1, если A загружается бок о бок в двух разных загрузчиках классов?Будет ли значение разделено для данного потока?

Ответы [ 2 ]

6 голосов
/ 16 февраля 2011

Интересный вопрос.Как объяснил Tom Hawtin - tackline , вы в основном создаете экземпляры ThreadLocal<String>().Теперь давайте посмотрим, как ThreadLocal на самом деле хранит значения (упрощенно):

public void set(T value) {
    ThreadLocalMap map = getMap(Thread.currentThread());
    map.set(this, value);
}

Требуется какая-то карта, которая привязана к каждому потоку и устанавливает значение с помощью this (сам) в качестве ключа.Это означает, что если у вас есть два ThreadLocals (созданные разными загрузчиками классов), они имеют различную ссылку this, тем самым эффективно сохраняя разные значения.

В целом - вы не можете, например, использовать ThreadLocal какОбходной путь к локальным синглтонам загрузчика классов и созданию локальных потоков.

4 голосов
/ 16 февраля 2011

Классы, загруженные разными загрузчиками классов, являются разными классами. Таким образом, это фактически то же самое, что:

class A {
    private static final ThreadLocal<String> tl = new ThreadLocal<String>();
}

class B {
    private static final ThreadLocal<String> tl = new ThreadLocal<String>();
}
...