Ответ
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.