【问题标题】:is static method safe for this case?这种情况下静态方法安全吗?
【发布时间】:2011-04-29 16:05:43
【问题描述】:

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

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

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

现在,我想应用 DRY 规则并使用此 showErrorMessage 方法制作一个静态类,但我不确定这是否安全...我的意思是 基于会话的静态方法与人脸上下文实例,这会产生冲突吗?

谢谢。

【问题讨论】:

    标签: java jsf


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      当静态方法使用可以从外部更改的可变变量时,它们是不安全的。例如

      private static String foo; // +getter +setter
      
      public static void foo() {
          // Do something with foo.
      }
      

      这不是线程安全的。当其他线程更改foo 而当前线程在foo() 内时,可能会发生争用情况。但是,您的不要使用任何外部可变变量。一切都被声明和使用方法本地/线程本地。所以是安全的。

      【讨论】:

        【解决方案3】:

        那个特定的静态方法是完全安全的。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-03
          • 2016-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-08
          相关资源
          最近更新 更多