您能否建议我们如何在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. 我们如何在我们的servlet上创建死锁条件
- 3. Java HashMap可以创建死锁吗?
- 4. 死锁:创建(所有进程终止)
- 5. 无法在eclipse中创建Servlet
- 6. 无法在maven项目中创建servlet
- 7. 我可以在Nunit中创建数据库死锁测试吗?
- 8. 如何在Grand Central Dispatch中创建死锁?
- 9. 在ViewModel中调用的异步方法导致死锁
- 10. 在实时应用程序中检测死锁的方法
- 11. LinkedBlockingQueue中的死锁(?)
- 12. GraphEngine中的死锁
- 13. Oracle中的死锁
- 14. scala中的'死锁'
- 15. ThreadPoolExecutor中的死锁
- 16. 第三方DLL中的死锁
- 17. Postgresql锁死锁
- 18. mysql死锁解决方案〜
- 19. 死锁c#解决方案
- 20. 在Java中的静态块中创建线程时引起的死锁
- 21. 在MySQL中获取死锁
- 22. 锁树算法死锁检测
- 23. NHibernate的死锁
- 24. 锁分区死锁
- 25. 死锁在查询
- 26. 死锁在SQL Server
- 27. Python:多处理中单锁的死锁
- 28. 在Golang中创建方法
- 29. 在方法中创建ProgressDialog
- 30. 创建Servlet Cookies
这个功课?你所描述的不会造成死锁,而是一个无限循环,当你用尽堆栈空间时,它最终会崩溃。参见[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