middle
Стоит ли волноваться о многопоточной безопасности работая с сервлетами
Да, потокобезопасность — критический аспект работы с сервлетами. Контейнер создаёт один экземпляр сервлета и вызывает его методы doGet(), doPost(), service() одновременно из разных потоков для обработки параллельных запросов.
Что потокобезопасно
- Локальные переменные методов
doGet()/doPost()— у каждого потока свой стек - Объекты
HttpServletRequestиHttpServletResponse— уникальны для каждого запроса - Методы
init()иdestroy()— вызываются один раз
Что НЕ потокобезопасно
- Поля экземпляра сервлета — разделяются между всеми потоками
- Статические переменные
- Разделяемые ресурсы (файлы, соединения к БД, кэши) без синхронизации
Правила безопасной работы
- Не хранить состояние запроса в полях сервлета
- Использовать локальные переменные вместо полей
- Для общих ресурсов использовать
synchronized,ConcurrentHashMap,AtomicIntegerи др. - Для хранения данных использовать request/session scope, а не поля сервлета
На собеседовании: интервьюер проверяет, понимаете ли вы, что сервлет — синглтон с разделяемым состоянием. Частая ошибка новичков — объявить
private int counter;в сервлете и инкрементировать его вdoGet().