9

したがって、次のように設定されたNサイズのサーバー配列があるとしましょう。

代替テキスト http://www.terracotta.org/web/download/attachments/43909161/ServerArrayMirrorGroup.png

私は単純な JavaBean/POJO を持っています:

package example;

public class Person {
  private OtherObject obj;

  public void setObj(OtherObject theObj) {
    synchronized (this) {
      obj = theObj;
    }
  }

  public OtherObject getObj() {
    synchronized (this) {
      return obj;
    }
  }
}

ここで、クライアントの 1 つが TC ルート (データ構造) の Person オブジェクトで Person.setObj(OtherObject) を呼び出すと、そのクライアントの同期ブロック(Person.setObj(OtherObject) 内) が保持されます。

1) Nサイズのサーバー配列内のN個のサーバーすべてがその Person.obj 属性と同期/更新されるまで?

また

2) 「アクティブな」サーバーがその更新された Person.obj 属性と同期されるまで? 次に、アレイ内の他の ( N-1 ) サーバーは可能な限り同期されますか?

また

3)私が見ている他の方法はありますか?

4

3 に答える 3

5

答えは実際には 1 か 2 ではありません。オブジェクトは、サーバー ミラー グループ間でストライピングされます。このフィールドが初めて設定されると、トランザクションが作成され、その最初のトランザクション用に選択されたミラー グループがその後オブジェクトを「所有」します。

1 と 2 の両方に関して、すべてのアクティブなサーバー グループを更新する必要があるわけではないため、これらの条件のいずれかを待つ必要はありません。

詳細については、Terracotta サーバー アレイの構成に関する Terracotta ドキュメントを参照してください。

ロックの観点からは、オブジェクトの変更を実行している間、この Person オブジェクトのクラスター化されたロックが保持されます (クラスター全体での相互排除)。同期ブロックのスコープは、上記のトランザクションを形成します。getObj() メソッドでは、これを読み取りロックとして構成して、クラスター全体で複数の同時読み取りを許可できます。

于 2009-05-04T14:24:55.907 に答える
3

他の誰もがあなたのオブジェクトへの参照を持っており、あなたがそうしている間/前/後にそれに触れることができると仮定します。したがって、解決策はロックを追加することです。

  • ロックを取得する
  • オブジェクトを変更する
  • ロック解除

そして、それがまさにsynchronizedが行うことです...キューを作成し、synchronizedメソッドを複数回呼び出すことはできません...しかし、それがどこかで参照されている場合、基になるオブジェクトに触れる可能性があります.

見る:

于 2009-05-03T22:52:19.220 に答える
0

私は彼らの(Terracotta)実装に精通していませんが、JMMの観点からはクラスター全体のロックが必要です。ただし、この例は非常に単純です。参照を変更するだけで、それがより揮発性の書き込みのようなものに変換され、ロックを完全に回避する可能性があります。

ただし、同期されたブロックで重要なことを行う場合、TCは同期されたブロックの開始時に悲観的にcluser全体のロックを取得すると思います。そうでなければ、JMMの仕様と対立することになります。私が理解しているように。

言い換えれば、あなたのオプション#1。したがって、クラスターで共有するものに注意し、可能な場合は不変オブジェクトとjava.util.concurrent。*データ構造を使用してください。後者はTCで特別な本質的な愛を得ています。

于 2009-05-03T00:31:27.087 に答える