2

如果该方法被例如commandButton组件作为AJAX 请求调用,并且该方法正在对托管bean 的实例变量进行操作,我们是否必须同步托管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,我是否必须同步该方法?

谢谢您的回答。

4

2 回答 2

5

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

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

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

private AtomicInteger count = new AtomicInteger();

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

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

// No setter!

也可以看看:

于 2013-03-20T11:29:23.313 回答
2

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

于 2013-03-20T08:28:35.770 回答