【问题标题】:Threadsafe method in Servlet Filter [duplicate]Servlet过滤器中的线程安全方法[重复]
【发布时间】:2015-11-30 14:12:28
【问题描述】:

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

我想要做的是在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:请将我重定向到任何已经回答此问题的问题(如果存在)。谢谢!

【问题讨论】:

  • 为什么不在应用启动时初始化呢?
  • 这是我的第一个想法,但由于项目中的其他限制,我无法做到这一点。我知道这很糟糕:)
  • @Rob 好的,您的评论让我看到问题比我预期的要深得多。感谢您的帮助

标签: java multithreading servlets


【解决方案1】:

更好的方法是使用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
}

【讨论】:

    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2012-02-10
    • 2011-03-24
    相关资源
    最近更新 更多