0

您能否建议我们如何在 servlet 中创建死锁,我认为这是在 doGet() 中调用 doPost() 方法和在 doPost() 中调用 doGet() 方法的一种简单方法,它将为 servlet 创建死锁情况. 请问有没有其他方法。

4

3 回答 3

1

对于每个请求,Web 容器都会创建一个新线程。在我的 servlet 中,我保留了 2 个方法。一个是doGet,另一个是doPost。这是我的servlet代码

public class DeadLockServlet extends HttpServlet {
       public static Object s = new Object();
       public static Object s1 = new Object();
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        synchronized (s) {
            System.out.println("Got lock of s in get");
            try {
                Thread.sleep(9977);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
      System.out.println("waiting for lock of s1 in get");
        synchronized (s1) {
            System.out.println("Got lock of s1 in get");
        }
        }

    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        synchronized (s1) {
            System.out.println("Got lock of s1 in post");
            try {
                Thread.sleep(9977);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
     System.out.println("waiting for lock of s in post");
        synchronized (s) {
            System.out.println("Got lock of s in  post");
        }
    }}

}

我的 abc.jsp 代码在这里

  <form action="DeadLockServlet" method="post">
    <input type="submit" value='ok'/>
    </form>

我正在从一个浏览器http://localhost:8090/DeadLockTest/abc.jsp向我的 servlet 发送请求(单击确定按钮时的 post 方法)。

来自另一个浏览器的另一个请求,例如http://localhost:8090/DeadLockTest/DeadLockServlet(用于 Get 方法)。现在您将遇到死锁情况

于 2015-11-20T14:43:40.317 回答
0

有很多方法(我敢说是无限期的吗?)来制造死锁。您的示例在某种程度上是一种(主要是无限循环)。最简单的方法是在一个对象上创建一个锁,该对象调用另一个方法来获取同一个对象上的锁,在这种情况下,锁将永远不会释放,因为它正在等待另一个方法获取锁,这是它无法做到的因为该对象已经锁定了它。

于 2012-07-20T16:51:00.990 回答
0

在下面部署 servlet 并调用它几次。

public class DeadLockServlet extends HttpServlet {
       private static long sleepMillis = 10000;
       private final Object lock1 = new Object();
       private final Object lock2 = new Object();

   private boolean switch = true;

   public void doGet(HttpServletRequest req, HttpServletResponse res)  throws ServletException, IOException  {

        if(switch){
            switch=!switch;
            lock12();
        }
        else{
            switch=!switch;
            lock21();
        }
        PrintWriter out = res.getWriter();
        out.println("Done!");
        out.close();
  }

   private void lock12() {
       synchronized (lock1) {
           sleep();
           synchronized (lock2) {
               sleep();
           }
       }
   }

   private void lock21() {
       synchronized (lock2) {
           sleep();
           synchronized (lock1) {
               sleep();
           }
       }
   }

   private void sleep() {
       try {
           Thread.sleep(sleepMillis);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
   }

}
于 2012-07-20T16:59:57.957 回答