О внутреннем дизайне "ThreadLocal" - PullRequest
1 голос
/ 11 февраля 2020

Я только что исследовал исходный код Java ThreadLocal , У меня два вопроса, надеюсь, вы мне поможете First

Первый , Почему бы просто не использовать один Map хранить все значения вместо привязки карты к потоку? Например:

public class ThreadLocal<T> {

    private ConcurrentHashMap<Thread, T> threadAndVal = new ConcurrentHashMap<>(); 

    // get value from threadAndVal.... put value to threadAndVal
}

И в методе set (значение T) я не видел никакой стратегии синхронизации. Этот потокобезопасный?

    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);  // ⬅️Why createMap is thread safe?
    }

Спасибо за помощь!

1 Ответ

3 голосов
/ 11 февраля 2020

Почему бы не использовать ConcurrentHashMap?

Основная причина - производительность. Использование потокобезопасной карты значительно медленнее, чем использование пользовательской карты без потоковой безопасности.

Вторичная причина заключается в том, что Map<Thread,T> будет сохранять ссылку на поток и значение до тех пор, пока ThreadLocal существует, и они часто используются в качестве статики.

Веселая третья причина в том, что я могу создать Thread с переопределенными equals и hashCode, который ведет себя непослушно.

Является ли ThreadLocal.set поточно-ориентированным?

Не должно быть. Первая строка:

Thread t = Thread.currentThread();

Все остальное делается на Thread t. Все эти операции могут быть выполнены только из этого точного потока.

...