我问了这个关于servlet中多线程的question,很多人建议使用一个静态变量。我该如何初始化这个信号量
如果我设置一个静态变量,我需要初始化它。例如公共静态信号量许可;
首先,我试图在与该小服务程序相关联的过滤器的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());
}
}
但是,因为它是从init()方法通过我不能使用CONF对象。我想从web.xml中获取限制编号,而不是对其进行硬编码。任何想法解决这个问题?
每个线程调用'init()'方法肯定不是真的。它在servlet实例化后直接被容器调用一次。请阅读本文以了解servlet如何工作:http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables/3106909#3106909 – BalusC 2011-06-02 11:16:05