Servlets web应用程序需要死锁

Servlets web应用程序需要死锁,servlets,deadlock,Servlets,Deadlock,出于某种原因,我想检查web应用程序中的死锁是如何发生的,这就是为什么我使用下面的代码,但是当我部署web应用程序并测试它时,我没有遇到死锁的情况!!有什么帮助吗 import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletExceptio

出于某种原因,我想检查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);
            }

        }
    }

}

}

虽然锁的顺序会导致死锁,但它需要精确的计时。我认为如果不在调试器中运行web服务器并单步执行代码,就不可能做到这一点

如果您不想或不能这样做,请在addStudent和addEmployee中的两个同步块之间添加足够长的睡眠时间。比如说,每人1分钟。然后差不多同时从两个客户机中点击servlet,一个做addStudent,另一个做addEmployee

“student”请求处理线程将获得“employee”锁,然后静坐等待一段时间。“employee”请求处理线程将获得“student”锁,然后静坐等待。然后其中一个线程会醒来,并尝试获取另一个锁,而另一个线程则会执行相反的操作,并且presto:deadlock

add***方法应更改为如下内容:

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);
            }
        }
    }
}

显然,僵局是要避免的,但是,嘿,那完全是另一个问题

我假设你使用应用程序的方式确保它必须同时为两个或多个请求提供服务?(换句话说,你在同一时间从两个不同的浏览器中点击了同一个url?死锁是一个痛苦的重演)我照你说的做了,但什么也没发生。请编辑上面的代码,告诉我在哪里添加睡眠功能,感谢添加的线程。在适当的地方睡眠(60秒)会导致死锁。如果您无法在一分钟内访问两个web客户端,请根据需要更改60*1000。