2011-06-02 43 views
0

我问了这个关于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中获取限制编号,而不是对其进行硬编码。任何想法解决这个问题?

+0

每个线程调用'init()'方法肯定不是真的。它在servlet实例化后直接被容器调用一次。请阅读本文以了解servlet如何工作:http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables/3106909#3106909 – BalusC 2011-06-02 11:16:05

回答

1

在初始化之前只需检查null的限制。

+0

这是实用和安全的。 – lamwaiman1988 2011-06-02 08:15:29

4

然后我认为有了这么多的线程,执行init()方法的每个线程都会初始化信号量,它应该不起作用。

我不明白。你的init()方法只能由Servlet容器调用一次。你如何使用这些过滤器/ servlet?线程是在servlet中创建的,还是在servlet之外创建的?

如果它是在servlet内部创建的,那么使用在init()方法中创建的变量应该没问题。

+0

也许我在想太多。 – lamwaiman1988 2011-06-02 08:07:54