Каким образом можно допустить в сервлете deadlock
Deadlock в сервлете можно получить при циклических синхронных вызовах между методами. Классический пример: метод doGet() вызывает doPost(), а doPost() вызывает doGet() — каждый ожидает завершения другого, что приводит к взаимной блокировке.
Другие способы допустить deadlock в сервлетах:
- Синхронизация на общих ресурсах в разном порядке в разных сервлетах (сервлет A блокирует ресурс 1, потом 2; сервлет B блокирует 2, потом 1)
- Использование
RequestDispatcher.forward()илиinclude()для вызова сервлета, который пытается захватить тот же монитор - Блокирующие вызовы внешних сервисов без таймаутов в synchronized-блоках
Для предотвращения deadlock следует избегать синхронизации в сервлетах по возможности, использовать неизменяемые объекты и локальные переменные, а при необходимости синхронизации — всегда захватывать мониторы в одном и том же порядке.
На собеседовании: вопрос проверяет понимание многопоточности в контексте сервлетов. Покажите, что знаете: сервлет — синглтон, обрабатывающий запросы в разных потоках. Любая синхронизация на полях экземпляра — потенциальный deadlock.