如何初始化此信号量

时间:2011-06-02 07:51:40

标签: java servlets static semaphore

我问过这个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获取限制数,而不是硬编码。有什么想法解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

  

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

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

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

答案 1 :(得分:1)

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