2012-04-04 1 views
0

по какой-то причине я хочу проверить, как тупик произошел в веб-приложении, поэтому я использовал код ниже, но когда я развертываю веб-приложение и проверяю его, я не попал в тупик положение дел !! любая помощьНеобходимость тупика в веб-приложении

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

     } 
    } 

} 

}

+0

Я предполагаю, что вы использовали приложение таким образом, чтобы убедиться, что он должен будет обслуживать два или более запросов одновременно? (другими словами, вы попадаете в один и тот же URL из двух отдельных браузеров в одно и то же время; взаимоблокировки - это боль для воспроизведения) –

+0

Я сделал то, что вы сказали, но ничего не произошло – Tahani

ответ

0

Хотя ваш заказ замок приведет в тупик, он требует точного времени. Я не думаю, что это возможно для вас, если вы не запустите этот веб-сервер в отладчике и не перейдете через код.

Если вы этого не хотите или не можете сделать, добавьте достаточно длинный сон между двумя синхронизированными блоками как в addStudent, так и в addEmployee. Скажем, по 1 минуте. Затем нажмите на сервлет из двух клиентов примерно в одно и то же время, один делает addStudent, а другой - addEmployee.

Образец обработки запросов «ученика» получит блокировку «employee», а затем сидит и ждет немного. Поток обработки запроса «employee» получит блокировку «ученика», затем сидит и ждет. Затем один из них проснется и попытается схватить другой замок, а другой поток сделает обратное, а престо: тупик.

ДОБАВЛЯТЬ *** методы должны быть изменены на что-то вроде этого:

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

Очевидно тупики следует избегать, но эй, это целый ругой вопрос!

+0

, пожалуйста, отредактируйте код выше, чтобы показать мне, где добавьте функцию сна, спасибо – Tahani

+0

Добавлен Thread.sleep (60s) в соответствующие места, чтобы вызвать тупик. Если вы не можете получить двух веб-клиентов, которые могут пострадать в течение минуты, при необходимости измените 60 * 1000. – sharakan

Смежные вопросы