Gymterview
middle

Каким образом можно допустить в сервлете deadlock

Deadlock в сервлете можно получить при циклических синхронных вызовах между методами. Классический пример: метод doGet() вызывает doPost(), а doPost() вызывает doGet() — каждый ожидает завершения другого, что приводит к взаимной блокировке.

Другие способы допустить deadlock в сервлетах:

  • Синхронизация на общих ресурсах в разном порядке в разных сервлетах (сервлет A блокирует ресурс 1, потом 2; сервлет B блокирует 2, потом 1)
  • Использование RequestDispatcher.forward() или include() для вызова сервлета, который пытается захватить тот же монитор
  • Блокирующие вызовы внешних сервисов без таймаутов в synchronized-блоках

Для предотвращения deadlock следует избегать синхронизации в сервлетах по возможности, использовать неизменяемые объекты и локальные переменные, а при необходимости синхронизации — всегда захватывать мониторы в одном и том же порядке.

На собеседовании: вопрос проверяет понимание многопоточности в контексте сервлетов. Покажите, что знаете: сервлет — синглтон, обрабатывающий запросы в разных потоках. Любая синхронизация на полях экземпляра — потенциальный deadlock.