我问过这个question关于servlet中的多线程,很多人建议使用静态变量。
如果我设置一个静态变量,我需要初始化它。例如,公共静态信号量允许;
首先,我尝试在与servlet关联的过滤器的init()方法中初始化它:
public void init(FilterConfig conf) throws ServletException {
// TODO Auto-generated method stub
try{
limit = Integer.parseInt(conf.getInitParameter("filterLimit"));
permits = new Semaphore(limit);
}catch(Exception ex){
conf.getServletContext().log("Fail to set the parameter : permits.");
throw new ServletException(ex.getMessage());
}
}
然后我认为有这么多线程,执行init()方法的每个线程都会初始化信号量,它应该不起作用。
然后我尝试使用静态初始化器:
static{
try{
limit = Integer.parseInt(conf.getInitParameter("filterLimit"));
permits = new Semaphore(limit);
}catch(Exception ex){
conf.getServletContext().log("Fail to set the parameter : permits.");
throw new ServletException(ex.getMessage());
}
}
但我不能使用conf对象,因为它是从init()方法传递的。我想从web.xml获取限制数,而不是硬编码。有什么想法解决这个问题吗?
答案 0 :(得分:4)
然后我认为有这么多线程,执行init()方法的每个线程都会初始化信号量,它应该不起作用。
我不明白。你的init()方法应该只由Servlet容器调用一次。你是如何使用这些过滤器/ servlet的?线程是在servlet中创建的,还是在servlet外部创建的?
如果它是在servlet中创建的,那么使用在init()方法中创建的变量应该没问题。
答案 1 :(得分:1)
在初始化之前,只需检查null的限制。