Servlet GLOBAL变量并发访问

时间:2013-07-06 06:33:30

标签: java servlets global-variables

我有servlet printingServlet并且有两个全局变量linesPrintedpages

    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   
    }

当只有一个用户调用此servlet时,这样可以正常工作,但最近它会在请求同时发送到时显示一些问题servlet

当请求创建错误而没有任何并发​​请求时,它可以正常工作。

应该采取什么措施来避免这样的问题?

1 个答案:

答案 0 :(得分:1)

Servlet实例变量不是线程安全的。由于只创建了一个servlet副本,并为每个传入请求创建了不同的线程,因此共享实例变量。因此,应该很好地保护servlet类实例变量的并发访问。使用AtomicInteger为您的计数器提供帮助!

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