package org.example; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/hello") public class HelloWorldServlet extends HttpServlet { static String PAGE_HEADER = "<html><head /><body>"; static String PAGE_FOOTER = "</body></html>"; @Override protected void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { if ( req.getParameter( "cmd" ).equals( "knifeAndFork" ) ) { knifeAndFork(); } else if ( req.getParameter( "cmd" ).equals( "forkAndKnife" ) ) { forkAndKnife(); } PrintWriter writer = resp.getWriter(); writer.println( PAGE_HEADER ); writer.println( "<h1>Hello, Deadlock!</h1>" ); writer.println( PAGE_FOOTER ); writer.close(); } private void forkAndKnife() { Fork fork = Fork.getInstance(); synchronized ( fork ) { fork.work(); try { Thread.sleep( 5000 ); } catch ( InterruptedException e ) { e.printStackTrace(); } Knife knife = Knife.getInstance(); synchronized ( knife ) { knife.work(); } } } private void knifeAndFork() { Knife knife = Knife.getInstance(); synchronized ( knife ) { knife.work(); try { Thread.sleep( 5000 ); } catch ( InterruptedException e ) { e.printStackTrace(); } Fork fork = Fork.getInstance(); synchronized ( fork ) { fork.work(); } } } }