2012-04-04 47 views
0

由於某種原因,我要檢查的僵局如何發生在Web應用程序,所以這就是爲什麼我用下面的代碼,但是當我部署Web應用程序並對其進行測試,我沒有僵局得到情況!任何幫助需要僵局Web應用程序

import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.ServletException; 
import java.util.ArrayList; 
import java.io.IOException; 
import java.io.PrintWriter; 

public class DeadLockServlet extends HttpServlet 
{ 
public static ArrayList student = new ArrayList(); 
public static ArrayList employee = new ArrayList(); 
PrintWriter out; 

@Override 
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    String lsAction = request.getParameter("action"); 
    String lsValue = request.getParameter("data"); 

    out = response.getWriter(); 
    String msg = ""; 
    if (lsAction != null) 
    { 
     if (lsAction.equals("addStudent")) 
     { 
      addStudent(lsValue); 
      msg = "Student added: "+lsValue; 
     } 
     else if (lsAction.equals("addEmployee")) 
     { 
      addEmployee(lsValue); 
      msg = "Employee added: "+lsValue; 
     } 
    } 
    else 
    { 
     msg = "Invalid Request"; 
    } 

    request.setAttribute("msg", msg); 
    request.setAttribute("student", student); 
    request.setAttribute("employee", employee); 
    request.getRequestDispatcher("index.jsp").forward(request, response); 
} 

public void addStudent(String lsValue) 
{ 
    synchronized (employee) 
    { 
     synchronized (student) 
     { 
      if (lsValue != null && !lsValue.equals("")) 
      { 
       student.add(lsValue); 
      } 
     } 
    } 
} 

public void addEmployee(String lsValue) 
{ 

    synchronized (student) 
    { 
     synchronized (employee) 
     { 

      if (lsValue != null && !lsValue.equals("")) 
      { 
       employee.add(lsValue); 
      } 

     } 
    } 

} 

}

+0

我假設您以這種方式行使應用程序,以確保它必須同時處理兩個或多個請求? (換句話說,你在同一時間從兩個不同的瀏覽器訪問相同的URL?死鎖是一個痛苦repro) – 2012-04-04 02:09:56

+0

我做了你說的,但沒有發生 – Tahani 2012-04-04 03:16:31

回答

0

雖然你的鎖訂貨會導致死鎖,它需要確切時間。如果沒有在調試器中運行該Web服務器並逐步完成代碼,我認爲不可能這樣做。

如果你不想或者不能做到這一點,在這兩個傳遞addStudent和addEmployee添加兩個同步塊之間的足夠長的睡眠。說,每個1分鐘。然後在大約在同一時間擊中這個servlet從兩個客戶,一個做傳遞addStudent,其他做addEmployee。

的「學生」請求處理線程將得到「員工」鎖,然後坐等了一下。 '員工'請求處理線程將獲得'學生'鎖,然後坐下來等待。然後,他們中的一個將被喚醒,並試圖搶在對方鎖,而其他線程會做相反的,和急:死鎖。

的加***方法應該改成這樣的:

public void addStudent(String lsValue) 
{ 
    synchronized (employee) 
    { 
     Thread.sleep(60 * 1000); 
     synchronized (student) 
     { 
      if (lsValue != null && !lsValue.equals("")) 
      { 
       student.add(lsValue); 
      } 
     } 
    } 
} 

public void addEmployee(String lsValue) 
{ 

    synchronized (student) 
    { 
     Thread.sleep(60 * 1000); 
     synchronized (employee) 
     { 

      if (lsValue != null && !lsValue.equals("")) 
      { 
       employee.add(lsValue); 
      } 
     } 
    } 
} 

顯然死鎖要避免,但是,嘿,這是一個整體諾特爾問題!

+0

你可以請,編輯上面的代碼,告訴我在哪裏加上睡眠功能,感謝 – Tahani 2012-04-08 07:58:33

+0

增加了Thread.sleep(60)在適當的地方,導致死鎖。如果一分鐘內無法讓兩個網絡客戶端點擊,請根據需要更改60 * 1000。 – sharakan 2012-04-08 12:58:16

相關問題