Страницы

Поиск по вопросам

понедельник, 17 декабря 2018 г.

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

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


Ответ

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

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

Отправить комментарий