почему у ThreadLocal есть только код threadlocalhash в Java

#java

Вопрос:

Сегодня, когда я отлаживаю свое приложение в RequestContext методе putLoginId, я обнаружил, что класс static ThreadLocal initial не удался, contextData.get() возвращаемое значение null, статические контекстные данные содержат только код threadlocalhash.

введите описание изображения здесь

Мое contextData определение в RequestContext классе, как это:

 public class RequestContext {
    public static final ThreadLocal<Map<String, Object>> contextData = new ThreadLocal<>();
}
 

он contextData должен быть инициализирован при загрузке класса, поэтому я думаю, что он никогда не будет равен нулю. Но почему это происходит и что я должен сделать, чтобы это исправить? Я что-то упускаю?

Комментарии:

1. Кроме того, хранение данных для каждого запроса, таких как идентификатор входа в систему, в глобальном состоянии (хотя и локально по потоку, но, тем не менее, потенциально сохраняется после завершения запроса) не такая хорошая идея.

Ответ №1:

данные контекста должны быть инициализированы при загрузке класса, поэтому я думаю, что они никогда не будут равны нулю

contextData инициализируется при загрузке класса; но на самом деле вы не даете ему значения (для каждого потока), по крайней мере, в показанном коде.


Укажите ThreadLocal начальное значение с помощью заводского метода, например:

 public static final ThreadLocal<Map<String, Object>> contextData =
    ThreadLocal.withInitial(HashMap::new);