Java.Servlet.How can I allow a deadlock in a servlet?

🧠 First, can a servlet have a deadlock?

Yes.
Because servlets are multithreaded:

  • One servlet instance is usually shared between many threads (one thread per request).
  • If you mess with shared resources (like instance variables or external locks) incorrectly, you can cause deadlocks — just like in normal multithreaded Java programs.

🔥 How You Might Allow a Deadlock in a Servlet

Deadlocks usually happen when:

  1. Two (or more) threads hold different locks.
  2. Each thread tries to acquire the other’s lock.
  3. Circular waiting happens — they are stuck forever.

In a servlet, this can happen if:

  • You have two or more synchronized blocks or locks.
  • Threads acquire them in different orders.

⚙️ Here’s an Example to create a Deadlock inside a Servlet:

public class DeadlockServlet extends HttpServlet {
    private final Object lock1 = new Object();
    private final Object lock2 = new Object();

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String threadName = Thread.currentThread().getName();
        
        if ("thread1".equals(request.getParameter("thread"))) {
            synchronized (lock1) {
                try { Thread.sleep(100); } catch (InterruptedException e) {}
                synchronized (lock2) {
                    response.getWriter().println("Thread 1 acquired lock1 and lock2");
                }
            }
        } else if ("thread2".equals(request.getParameter("thread"))) {
            synchronized (lock2) {
                try { Thread.sleep(100); } catch (InterruptedException e) {}
                synchronized (lock1) {
                    response.getWriter().println("Thread 2 acquired lock2 and lock1");
                }
            }
        } else {
            response.getWriter().println("Specify thread=thread1 or thread2 in URL");
        }
    }
}

What happens here:

  • thread1 locks lock1 first, then tries to lock lock2.
  • thread2 locks lock2 first, then tries to lock lock1.
  • If timing is right (both lock their first lock before trying to get the second),
    💥 deadlock — both threads will wait on each other forever.

🎯 How to trigger the deadlock:

Open two tabs very quickly:

http://localhost:8080/yourapp/deadlockservlet?thread=thread1
http://localhost:8080/yourapp/deadlockservlet?thread=thread2

Both tabs will hang!

⚡ Quick Recap:

Deadlock can happenBecause servlets are multithreaded.
You allow itBy mismanaging multiple locks with inconsistent lock order.
Typical mistakeSynchronized blocks with multiple resources but no consistent locking strategy.

⚠️ Important:

In real-world servlet applications, you should never allow deadlocks.
You’d avoid it by:

  • Always locking resources in a consistent order.
  • Minimizing synchronized blocks.
  • Using higher-level concurrency tools (ReentrantLock, etc.) carefully.
  • Or better, designing to avoid shared mutable state between threads.
This entry was posted in Без рубрики. Bookmark the permalink.