2012-07-20 51 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方法)。 現在你會得到這個僵局