0

サーブレットprintingServlet があり、2 つのグローバル変数がlinesPrintedあり、pages

    public class printingServlet extends HttpServlet {
       int linesPrinted = -3;
       int pages = 0;

       ----
       ----
      protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {

             //print some lines
             //increment linesPrinted  and pages

             //call function2,function3,function4,Checkfunction
       }
      public void function1(){

          //print some lines
          // increment linesPrinted and pages
          //call Checkfunction
      }
      public void function2(){

          //print some lines
          // increment linesPrinted and pages
          //call Checkfunction
      }
      public void function3(){

          //print some lines
          // increment linesPrinted and pages
          //call Checkfunction
      }
      public void Checkfunction(){

          // check linesPrinted and pages
          // Do some stuff if specific values are reached else continue
      } 



all @override methods   
    }

これは、1 人のユーザーのみがこれを呼び出した場合は正常に機能しますservletが、最近、要求が に同時に送信されると、ページ行のservlet計算に問題が発生します。

エラーを作成したリクエストが同時リクエストなしでリクエストされた場合、正常に動作します。

このような問題を回避するにはどうすればよいでしょうか。

4

1 に答える 1

1

サーブレット インスタンス変数はスレッド セーフではありません。作成されるサーブレットのコピーは 1 つだけであり、着信要求ごとに作成される異なるスレッドがインスタンス変数を共有するためです。したがって、サーブレット クラスのインスタンス変数への同時アクセスは十分に保護する必要があります。カウンターに AtomicInteger を使用すると役立つはずです。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/atomic/AtomicInteger.html

于 2013-07-06T06:37:48.713 に答える