您能否建議我們如何在servlet中創建死鎖?在我想的方法是在doPost()和doPet()內部調用doPost()方法的一種簡單方法()它會爲servlet創建死鎖情況。請告知是否有其他方法。在servlet中創建死鎖的方法
0
A
回答
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方法)。 現在你會得到這個僵局
相關問題
- 1. 創建死鎖
- 2. 死鎖鎖()方法
- 3. 我們如何在我們的servlet上創建死鎖條件
- 4. performBlockAndWait創建死鎖
- 5. Java HashMap可以創建死鎖嗎?
- 6. 死鎖:創建(所有進程終止)
- 7. 在POST方法之外創建方法是servlet
- 8. 無法在maven項目中創建servlet
- 9. 無法在eclipse中創建Servlet
- 10. 同步方法,以避免死鎖
- 11. 在MySQL中創建超時和死鎖錯誤
- 12. 我可以在Nunit中創建數據庫死鎖測試嗎?
- 13. 如何在Grand Central Dispatch中創建死鎖?
- 14. 在實時應用程序中檢測死鎖的方法
- 15. 在ViewModel中調用的異步方法導致死鎖
- 16. System.Diagnostic.Process中的死鎖
- 17. LinkedBlockingQueue中的死鎖(?)
- 18. ThreadPoolExecutor中的死鎖
- 19. GraphEngine中的死鎖
- 20. MYSQL中的死鎖
- 21. Oracle中的死鎖
- 22. scala中的'死鎖'
- 23. 第三方DLL中的死鎖
- 24. 死鎖SQLServer中
- 25. Postgresql鎖死鎖
- 26. 如何在不使用事務的情況下創建死鎖?
- 27. 死鎖在MCS鎖實施
- 28. 死鎖 - 轉移方案
- 29. 死鎖c#解決方案
- 30. mysql死鎖解決方案〜
這個功課?你所描述的不會造成死鎖,而是一個無限循環,當你用盡堆棧空間時,它最終會崩潰。參見[Wikipedia antry for deadlock](http://en.wikipedia.org/wiki/Deadlock) – theglauber 2012-07-20 16:50:13
方法A()內的方法B()和方法B()的調用方法A()不是死鎖,而是無限循環(這將創建StackOverflow異常)。死鎖就是當很少的線程同時等待其他任何活動繼續其任務的情況。 – Pshemo 2012-07-20 16:50:50
你可能有你的帖子/得到的例子[這裏](http://javarevisited.blogspot.com/2011/09/servlet-interview-questions-answers.html)。我不明白這是一個怎樣的僵局。也許這意味着它會導致servlet出現「鎖定」並表現得像「死」一樣...但從技術意義上講,這不是一個僵局。 – theglauber 2012-07-20 16:55:38