什么时候托管bean的方法应该同步?

时间:2013-03-20 08:13:01

标签: jsf thread-safety managed-bean

如果通过例如此方法调用此方法,是否必须同步托管bean方法commandButton组件作为AJAX请求,该方法是在托管bean的实例变量上运行的吗?

假设我们有这个简单的托管bean:

public class ManagedBeanTest {

  private int count;

  public int getCount() {
    return count;
  }

  public void setCount(int count) {
    this.count = count;
  }

  public String increaseCount() {
    count++;
    return null;
  }

}

因此,如果在这种情况下increaseCount方法被commandButton内的action组件调用,我是否必须同步此方法?

感谢您的回答。

2 个答案:

答案 0 :(得分:5)

  

何时应该同步托管bean的方法?

当托管bean放入错误的范围时。因此,在适当设计的应用程序中,永远不会。

您的特定示例中,您应该使用AtomicInteger代替int,并且可能使用一堆synchronized修饰符。

private AtomicInteger count = new AtomicInteger();

public int getCount() {
    return count.get();
}

public void incrementCount() {
    count.incrementAndGet();
}

// No setter!

另见:

答案 1 :(得分:2)

取决于用例和bean的范围。如果您的托管bean是请求范围,则不需要任何同步。在视图范围内的bean中,当您有多个AJAX请求时,不存在竞争条件问题(根据JSF 2规范和关于Ajax请求队列的章节,来自同一客户端的AJAX请求按顺序排队并执行)。但是,您应该同步会话范围的bean方法(例如,如果多个选项卡中的用户打开页面)。当然,应该同步应用程序范围bean的方法,这些方法操作托管bean的字段。