我觉得这可能已经在某个地方得到了解答,但我找不到它,或者我没有使用正确的关键字。
我想要做的是初始化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:请将我重定向到已经回复过的任何问题(如果存在的话)。谢谢!
答案 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
}