您能否建议我们如何在 servlet 中创建死锁,我认为这是在 doGet() 中调用 doPost() 方法和在 doPost() 中调用 doGet() 方法的一种简单方法,它将为 servlet 创建死锁情况. 请问有没有其他方法。
问问题
5955 次
3 回答
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 方法)。
来自另一个浏览器的另一个请求,例如http://localhost:8090/DeadLockTest/DeadLockServlet(用于 Get 方法)。现在您将遇到死锁情况
于 2015-11-20T14:43:40.317 回答
0
有很多方法(我敢说是无限期的吗?)来制造死锁。您的示例在某种程度上是一种(主要是无限循环)。最简单的方法是在一个对象上创建一个锁,该对象调用另一个方法来获取同一个对象上的锁,在这种情况下,锁将永远不会释放,因为它正在等待另一个方法获取锁,这是它无法做到的因为该对象已经锁定了它。
于 2012-07-20T16:51:00.990 回答
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();
}
}
}
于 2012-07-20T16:59:57.957 回答