2012-07-20 49 views
0

您能否建议我们如何在servlet中创建死锁?在我想的方法是在doPost()和doPet()内部调用doPost()方法的一种简单方法()它会为servlet创建死锁情况。请告知是否有其他方法。在servlet中创建死锁的方法

+1

这个功课?你所描述的不会造成死锁,而是一个无限循环,当你用尽堆栈空间时,它最终会崩溃。参见[Wikipedia antry for deadlock](http://en.wikipedia.org/wiki/Deadlock) – theglauber 2012-07-20 16:50:13

+1

方法A()内的方法B()和方法B()的调用方法A()不是死锁,而是无限循环(这将创建StackOverflow异常)。死锁就是当很少的线程同时等待其他任何活动继续其任务的情况。 – Pshemo 2012-07-20 16:50:50

+0

你可能有你的帖子/得到的例子[这里](http://javarevisited.blogspot.com/2011/09/servlet-interview-questions-answers.html)。我不明白这是一个怎样的僵局。也许这意味着它会导致servlet出现“锁定”并表现得像“死”一样...但从技术意义上讲,这不是一个僵局。 – theglauber 2012-07-20 16:55:38

回答

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(); 
     } 
    } 

} 
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> 

我从一个浏览器发送请求到我的servlet http://localhost:8090/DeadLockTest/abc.jsp(对于POST方法,同时点击okbutton)。

来自另一个浏览器的另一个请求,如http://localhost:8090/DeadLockTest/DeadLockServlet(用于Get方法)。 现在你会得到这个僵局