Расскажите об интерфейсе SingleThreadModel
SingleThreadModel — маркерный интерфейс (без методов), при реализации которого контейнер гарантирует, что метод service() сервлета не будет одновременно выполняться в двух потоках. Контейнер реализует это либо через синхронизацию доступа к единственному экземпляру, либо через пул экземпляров сервлета.
Этот интерфейс является anti-pattern и deprecated с Servlet 2.4 по следующим причинам:
- Синхронизация экземпляра не защищает разделяемые ресурсы (
staticполя, внешние системы, сессии) - Серьёзно снижает производительность — запросы обрабатываются последовательно
- Создаёт ложное чувство безопасности — разработчик думает, что проблемы многопоточности решены
Правильный подход к потокобезопасности — не хранить состояние в полях сервлета, использовать локальные переменные и потокобезопасные структуры данных.
На собеседовании: важно сказать, что
SingleThreadModeldeprecated и является anti-pattern. Если интервьюер спрашивает, как обеспечить потокобезопасность — ответ через stateless-дизайн, а не черезSingleThreadModel.