Что такое ThreadLocal в Java?

«Что такое ThreadLocal в Java?» — вопрос из категории Java Core, который задают на 22% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ThreadLocal — это класс в Java, который предоставляет переменные, доступные только для конкретного потока. Каждый поток имеет свою независимую копию данных, что исключает необходимость синхронизации.

Как это работает: При вызове get() или set() методы оперируют значением, привязанным к текущему выполняющемуся потоку.

Пример использования:

// Создание ThreadLocal с начальным значением
ThreadLocal<Integer> threadLocalValue = ThreadLocal.withInitial(() -> 0);

// В потоке A
threadLocalValue.set(42);
System.out.println(threadLocalValue.get()); // Выведет: 42

// В потоке B (тот же объект ThreadLocal)
threadLocalValue.set(99);
System.out.println(threadLocalValue.get()); // Выведет: 99
// Значение в потоке A осталось 42

Типичные сценарии применения:

  • Хранение контекста пользовательской сессии в веб-приложении.
  • Передача данных через цепочку вызовов без явной передачи параметров.
  • Изоляция ресурсов, небезопасных для использования из нескольких потоков.

Важные замечания:

  • Утечки памяти: В пулах потоков (например, в сервлет-контейнерах) необходимо явно вызывать remove() после использования, иначе значения могут сохраняться дольше жизни запроса.
  • Наследование: По умолчанию значения не наследуются дочерними потоками. Для этого используется InheritableThreadLocal.