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によって呼び出された場合、このメソッドを同期する必要がありますか?commandButtonaction

ご回答ありがとうございます。

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 に答える