0

サーブレットでデッドロックを作成する方法を教えてください。私が考えていた方法は、doGet() 内で doPost() メソッドを呼び出し、doPost() 内で doGet() メソッドを呼び出す 1 つの簡単な方法であり、サーブレットのデッドロック状況を作成します。 . 他に方法があれば教えてください。

4

3 に答える 3

0

以下のサーブレットをデプロイし、数回呼び出します。

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 に答える
0

デッドロックを作成する方法はたくさんあります (あえて無期限と言いますか?)。あなたの例はある意味で1つです(ほとんどの場合、無限ループです)。最も簡単な方法は、別のメソッドを呼び出して同じオブジェクトのロックを取得するオブジェクトにロックを作成することです。この場合、他のメソッドがロックを取得するのを待っているため、ロックは決して解放されませんが、それはできません。オブジェクトはすでにロックされているためです。

于 2012-07-20T16:51:00.990 に答える