Потокобезопасность singleton-бинов
Вопрос
Потокобезопасны ли singleton-бины в Spring? Как вы пишете сервисы, чтобы не было проблем?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Spring не делает бины потокобезопасными
Один экземпляр используют все потоки запросов
Сервисы без изменяемого состояния: только final-зависимости
Данные запроса через параметры, а не поля
Если состояние нужно: потокобезопасные структуры, атомики, кеши
Что могут спросить следом
- Где хранить данные текущего пользователя?
- Безопасно ли хранить в поле SimpleDateFormat?
Разбор
Сам Spring ничего не синхронизирует: singleton-бин это один объект, который параллельно используют все потоки веб-сервера. Поэтому сервисы пишу stateless: в полях только final-зависимости, которые сами потокобезопасны, а данные запроса передаются параметрами. Если состояние действительно нужно, например счётчик или кеш, использую AtomicLong, ConcurrentHashMap или готовый кеш вроде Caffeine. Данные текущего пользователя беру из SecurityContext или request-скоупа. Классическая ловушка: SimpleDateFormat в поле сервиса, он не потокобезопасен, вместо него DateTimeFormatter, который неизменяем.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.