Servlet过滤器中的Threadsafe方法

时间:2015-11-30 14:12:29

标签: java multithreading servlets

我觉得这可能已经在某个地方得到了解答,但我找不到它,或者我没有使用正确的关键字。

我想要做的是初始化Servlet Filter中的值,尽可能少阻塞。我绝不是线程专家,所以这就是我想出的:

private static Object getObject() {
    if(OBJECT == null) {
        synchronized (MyClass.class) {
            InputStream is = getInputStream("path_to_file");
            OBJECT = loadObject(is);
        }
    }
    return OBJECT;
}

此方法在Servlet过滤器中使用,将由多个线程一次调用。我想确保在需要时加载它,而不是init方法。

我的问题是,这个线程安全吗?一旦它被初始化,我认为它会很好,但我想确保它在初始化时有效。

PS:请将我重定向到已经回复过的任何问题(如果存在的话)。谢谢!

1 个答案:

答案 0 :(得分:0)

更好的方法是使用init方法:

  

servlet容器调用init方法   实例化过滤器后完全一次。 init方法必须   在要求过滤器进行任何过滤之前成功完成   工作

http://docs.oracle.com/javaee/5/api/javax/servlet/Filter.html#init(javax.servlet.FilterConfig)

public void init(FilterConfig filterConfig) throws ServletException {
     // read the file here, this method will be called only once
}