请问你能告诉我们如何在servlet中创建一个死锁,我想的是一种简单的方法来调用doPet()内的doPost()方法和doPost()里面的doGet()方法会产生死锁的情况对于servlet。请告知有没有其他办法。
答案 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>
我正在从一个浏览器http://localhost:8090/DeadLockTest/abc.jsp向我的servlet发送请求(对于post方法,同时单击okbutton)。
来自其他浏览器的另一个请求,例如http://localhost:8090/DeadLockTest/DeadLockServlet(对于Get方法)。 现在你将得到僵局的情况
答案 1 :(得分:0)
有很多方法,(我敢说无限期?),造成僵局。你的例子是某种方式(大多数只是一个无限循环)。最简单的方法是在一个对象上创建一个锁,该对象调用另一个方法来锁定同一个对象,在这种情况下,锁将永远不会释放,因为它正在等待另一个方法获取一个锁,这是不能做的因为该对象已经锁定它。
答案 2 :(得分: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();
}
}
}