Servlet实例变量不是线程安全的。由于只创建了servlet的一个副本,并且为每个传入请求创建了不同的线程,因此共享实例变量。因此,应该很好地保护servlet类实例变量的并发访问。对计数器使用AtomicInteger应该会有所帮助!
我有servlet printingServlet
,并且有两个全局变量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
}
当只有一个用户调用此servlet
时,这可以很好地工作,但最近当请求同时发送到servlet
时,它在页和行计算中显示了一些问题。
当创建错误的请求在没有任何并发请求的情况下被请求时,它可以正常工作。
应该采取什么措施来避免这样的问题?
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/atomic/AtomicInteger.html