Gymterview
middle

Стоит ли волноваться о многопоточной безопасности работая с сервлетами

Да, потокобезопасность — критический аспект работы с сервлетами. Контейнер создаёт один экземпляр сервлета и вызывает его методы doGet(), doPost(), service() одновременно из разных потоков для обработки параллельных запросов.

Что потокобезопасно

  • Локальные переменные методов doGet()/doPost() — у каждого потока свой стек
  • Объекты HttpServletRequest и HttpServletResponse — уникальны для каждого запроса
  • Методы init() и destroy() — вызываются один раз

Что НЕ потокобезопасно

  • Поля экземпляра сервлета — разделяются между всеми потоками
  • Статические переменные
  • Разделяемые ресурсы (файлы, соединения к БД, кэши) без синхронизации

Правила безопасной работы

  • Не хранить состояние запроса в полях сервлета
  • Использовать локальные переменные вместо полей
  • Для общих ресурсов использовать synchronized, ConcurrentHashMap, AtomicInteger и др.
  • Для хранения данных использовать request/session scope, а не поля сервлета

На собеседовании: интервьюер проверяет, понимаете ли вы, что сервлет — синглтон с разделяемым состоянием. Частая ошибка новичков — объявить private int counter; в сервлете и инкрементировать его в doGet().