Frage

kann also sagen, ich habe ein N Größe Server Array wie so ein:

alt text http://www.terracotta.org/web /download/attachments/43909161/ServerArrayMirrorGroup.png

Ich habe eine einfache 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;
    }
  }
}

Nun, wenn einer der Clients ruft Person.setObj (OtherObject) auf einer Person Objekt in der TC-Wurzel (Datenstruktur), ist der synchronisierten Block (in Person.setObj (OtherObject)) auf dass Client gehalten:

1), bis alle N der Server in der N Größe Server Array wurden mit diesem Person.obj synchronisiert / aktualisiert Attribut?

oder

2), bis der „aktive“ Server wird mit dem aktualisierten Person.obj Attribute synchronisiert wird? Dann die andere ( N-1 ) Server in dem Array ist wie möglich synchronisiert?

oder

3) Einige andere Methode, die ich über bin auf der Suche?

War es hilfreich?

Lösung

Die Antwort ist nicht wirklich 1 oder 2. Die Objekte werden über die Server-Spiegelgruppen gestreift. Das erste Mal, dieses Feld gesetzt ist, wird eine Transaktion erzeugt, und dass Spiegelgruppe für die erste Transaktion gewählt wird „OWN“ das Objekt danach.

Mit Bezug sowohl auf 1 und 2 sind nicht alle aktiven Servergruppen müssen aktualisiert werden, so dass es keine Notwendigkeit für eine dieser beiden Bedingungen zu warten ist.

Sie können weitere Informationen auf der Terrakotta-Dokumentation über den Terrakotta-Server-Array zu konfigurieren:

Von einer Verriegelungs Sicht würde die gruppierten Sperre auf diesem Objekt Person gehalten werden (mutual exclusion über den Cluster), während die Modifikation Objekt durchführt. Der Umfang der synchronisierten Block bildet die Transaktion oben erwähnt. Im getObj () -Methode, Sie könnten dies als eine Lesesperre konfigurieren, die mehrere gleichzeitige Leser über den Cluster erlauben würde.

Andere Tipps

Nehmen wir an, alle anderen einen Verweis auf das Objekt hat und es berühren kann, während / vor / nach tun. Somit wäre die Lösung Schlösser hinzuzufügen, und

  • erhalten Sperre
  • ändern Sie das Objekt
  • Entriegelungsschloss

Und das ist genau das, was synchronisiert tut ... es schafft eine Warteschlange und die synchronisierte Methode kann nicht mehr als einmal aufgerufen werden ... aber das zugrunde liegende Objekt könnte berührt wird, wenn es irgendwo verwiesen wird.

siehe:

Ich bin nicht vertraut mit ihrer (Terrakotta) Implementierung, sondern von einem JMM Standpunkt, es sollte nimmt eine clusterweite Sperre. Jedoch ist dieses Beispiel sehr einfach; nur eine Änderung einer Referenz, und das kann es dazu führen, umgewandelt in etwas, das eher wie ein flüchtigen Schreib ist und vollständig Verriegelung vermeiden.

Aber, wenn Sie in Ihrem synchronisierten Block nicht-triviale Dinge zu tun, dann würde ich davon ausgehen, dass TC pessimistisch eine cluser weite Sperre zu Beginn des synchronisierten Blockes nimmt. Wenn sie es nicht tun, würden sie im Widerspruch zu der JMM spec sein. wie ich es verstehe.

Mit anderen Worten: Ihre Option # 1. Also, seien Sie vorsichtig, was Sie im Cluster gemeinsam nutzen, und verwenden Sie unveränderliche Objekte und java.util.concurrent * Datenstrukturen, wenn Sie können -.. Letzteres besondere Eigen Liebe in TC bekommen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top