我有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
。
当请求创建错误而没有任何并发请求时,它可以正常工作。
应该采取什么措施来避免这样的问题?
答案 0 :(得分:1)
Servlet实例变量不是线程安全的。由于只创建了一个servlet副本,并为每个传入请求创建了不同的线程,因此共享实例变量。因此,应该很好地保护servlet类实例变量的并发访问。使用AtomicInteger为您的计数器提供帮助!
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/atomic/AtomicInteger.html