Зачем нужен класс ThreadLocal в Java?

325
28 февраля 2017, 15:32

Поясните в общих чертах что это и с чем его едят, а после - может и ссылку годную на пример :)

Answer 1

ThreadLocal - это такой тип для поля, привязанный к потоку. То есть, у каждого потока эта поле свое. Даже если это поле будет статическое, оно все равно у каждого потока будет свое. Некоторые считают, что это ещё одна "специфическая область видимости".

Почитать

  • О бедном ThreadLocal замолвите слово
  • Использование ThreadLocal переменных
Answer 2

ThreadLocal — это тип, значение которого своё в каждом потоке.

Для чего такое может понадобиться? Если несколько сценариев.

Например, у вас есть приложение, которое пользуется различными библиотеками и фреймворками, цепочка вызовов уходит очень глубоко, и где-то там вызывает ваш callback. Вы хотели бы передать дополнительную информацию (например, права текущего юзера, или там просто кэш), но промежуточные фреймворки не протягивают через цепочку вызовов эту дополнительную информацию. Что делать? Можно воспользоваться статическими переменными, но что если ваше приложение многопоточное? За статические переменные будет конкуренция между потоками. Решение — кладите информацию на входе в ThreadLocal, на выходе в callback'е можно будет забрать.

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

Похожий сценарий описан здесь: многопоточный доступ к SimpleDateFormat не разрешён, и чтобы не пересоздавать объект при каждом вызове, можно закэшировать его в ThreadLocal.

READ ALSO
Сохранение и загрузка состояния Activity

Сохранение и загрузка состояния Activity

Возможно ли в Android сохранить разметку с значениями в файл, чтобы после можно было её из этого файла потом загрузить?

381
Сборка Maven JDR Архива в intellij idea

Сборка Maven JDR Архива в intellij idea

Я имею единственный класс:

265
Многопоточность в Java [требует правки]

Многопоточность в Java [требует правки]

Необходимо продвинутое понимание и практические примеры , что и как работает в Java по многопоточностиЕсть ли учебные материалы и разбор практики?...

220
Значение понятия Plain Old Java Object(POJO) в Java

Значение понятия Plain Old Java Object(POJO) в Java

POJO (англPlain Old Java Object) — «старый добрый Java-объект», простой Java-объект, не унаследованный от какого-то специфического объекта и не реализующий...

429