Ответ вслух Junior Бины: скоупы и жизненный цикл обновлено

Потокобезопасность singleton-бинов

Вопрос

Потокобезопасны ли singleton-бины в Spring? Как вы пишете сервисы, чтобы не было проблем?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Сам Spring ничего не синхронизирует: singleton-бин это один объект, который параллельно используют все потоки веб-сервера. Поэтому сервисы пишу stateless: в полях только final-зависимости, которые сами потокобезопасны, а данные запроса передаются параметрами.

Что должно прозвучать в ответе

  • Spring не делает бины потокобезопасными

  • Один экземпляр используют все потоки запросов

  • Сервисы без изменяемого состояния: только final-зависимости

  • Данные запроса через параметры, а не поля

  • Если состояние нужно: потокобезопасные структуры, атомики, кеши

Что могут спросить следом

  • Где хранить данные текущего пользователя?
  • Безопасно ли хранить в поле SimpleDateFormat?

Разбор

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

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.