在servlet中创建死锁的方法

时间:2012-07-20 16:44:38

标签: java java-ee servlets

请问你能告诉我们如何在servlet中创建一个死锁,我想的是一种简单的方法来调用doPet()内的doPost()方法和doPost()里面的doGet()方法会产生死锁的情况对于servlet。请告知有没有其他办法。

3 个答案:

答案 0 :(得分: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方法,同时单击okbutton)。

来自其他浏览器的另一个请求,例如http://localhost:8090/DeadLockTest/DeadLockServlet(对于Get方法)。 现在你将得到僵局的情况

答案 1 :(得分:0)

有很多方法,(我敢说无限期?),造成僵局。你的例子是某种方式(大多数只是一个无限循环)。最简单的方法是在一个对象上创建一个锁,该对象调用另一个方法来锁定同一个对象,在这种情况下,锁将永远不会释放,因为它正在等待另一个方法获取一个锁,这是不能做的因为该对象已经锁定它。

答案 2 :(得分: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();
       }
   }

}