对于这种情况,静态方法是否安全?

时间:2011-04-29 16:05:43

标签: java jsf

在我的web jsf应用程序中,我使用此方法向用户显示不同的消息:

private void showErrorMessage(final String message) {
    FacesContext.getCurrentInstance().addMessage(null,
            new FacesMessage(message));
}

位于每个bean中,需要以某种方式警告用户。

现在,我想应用 DRY 规则并使用这个showErrorMessage方法创建一个静态类是静态类,但我不确定这是否安全...我的意思是< strong>静态方法vs面部上下文的实例基于会话,这会产生冲突吗?

感谢。

3 个答案:

答案 0 :(得分:2)

我不太确定如何返回当前实例,但我敢打赌使用ThreadLocal,因此你应该使用静态方法。它基本上只是对静态getCurrentInstance()方法的现有调用的便捷方法。

答案 1 :(得分:1)

静态方法在使用可从外部更改的可变变量时不安全。 E.g。

private static String foo; // +getter +setter

public static void foo() {
    // Do something with foo.
}

这不是线程安全的。当当前线程在foo内时,当其他线程更改foo()时,可能会发生竞争条件。但是,您不使用任何外部可变变量。一切都被声明并使用methodlocal / threadlocal。所以这很安全。

答案 2 :(得分:1)

这种特殊的静态方法非常安全。

getCurrentInstance()返回一个线程局部的FacesContext对象。 FacesContext封装了与当前线程正在处理的请求相关的状态。另一个线程将处理不同的请求,并将获得不同的FacesContext实例。