Servlet GLOBAL变量并发访问



我有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时,它在计算中显示了一些问题。

当创建错误的请求在没有任何并发请求的情况下被请求时,它可以正常工作。

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

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

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

相关内容

  • 没有找到相关文章