托管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方法是由action内部的commandButton组件调用的,我必须同步这个方法吗?

谢谢你的回答。

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

当托管bean被放置在错误的作用域时。因此,在设计合理的应用程序中,永远不会出现这种情况。

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

private AtomicInteger count = new AtomicInteger();
public int getCount() {
    return count.get();
}
public void incrementCount() {
    count.incrementAndGet();
}
// No setter!

参见:

  • 如何选择合适的bean scope?
  • 是JSF 2。@ViewScoped托管bean线程安全吗?

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

相关内容

  • 没有找到相关文章

最新更新