Frage

Was ist der Unterschied zwischen einer Collections.synchronizedMap () und einem Wrapper um eine HashMap mit allen synchronisierten Methoden. Ich habe nicht einen Unterschied becuase Collections.synchronizedMap sehen () intern für alle Methoden die gleiche Sperre aufrechterhält.

Im Grunde, was ist der Unterschied zwischen dem folgenden Code-Schnipsel

Class C {    
    Object o;

    public void foo() {
       synchronized(o) {
           // thread safe code here
       }
    }
}

und

Class C {
    Object o;

    public synchronized void foo() {

    }
}
War es hilfreich?

Lösung

Es gibt nur einen Unterschied:

Collections.synchronizedMap ist in der Lage einen anderen Monitor verwenden, als sich selbst.

synchronisiert Methoden ist die gleiche wie unter Verwendung sychnchonized(this)-Blöcken, die Mittel, würde die Umhüllung der Monitor sein und von der Außenseite der Umhüllung verschlossen werden konnte.

Wenn Sie eine externe Anwendung nicht Ihren Monitor sperren möchten, müssen Sie es verbergen.

Auf der anderen Seite, wenn Sie mehrere Methoden in einem Thread sichere Art und Weise nennen wollen, ist es der einfachste Weg, die ganze Sammlung zu sperren (aber es ist nicht sehr skalierbar, in der Tat).

Ps. Zur Wiederverwendung, es ist besser, die Methodenaufrufe zu einem Backup-Karte zu übertragen, als die Klasse außer Kraft zu setzen, weil Sie später auf eine andere Map Implementierung wechseln, ohne Ihre Wrapper zu ändern

Andere Tipps

Beide Ansätze einen Monitor auf dem Objekt erwerben und so ausführen sollte genau das gleiche. Der Hauptgrund für den Unterschied ist architektonisch. Der synchronisierte wrapper ermöglicht leicht den Grund nicht threadsicher Variation erstreckt.

Having said, die nicht verwenden entweder die Verwendung ConcurrentHashMap. Es verwendet Lock Striping so ist es viel schneller zu bedienen als jeder Ansatz (wie sie das gleiche in Bezug auf die Kopf + Anstoßes sind). Lock-Striping kann Segmente der Trägeranordnung unabhängig zu verriegeln. Dies bedeutet, es ist weniger wahrscheinlich, dass zwei Threads die gleiche Sperre erhalten wird fordern.

Setzen Sie das Rad nicht neu zu erfinden und verwenden, was von der API zur Verfügung gestellt wird.

Sie sollten immer dekorieren anstatt alles Verklumpen und alle feartures zu einer großen Funktionsumfang Klasse.

Nehmen Sie immer die Ebene Karte und dekorieren sie mit Sammlungen oder eine java.util.concurrent verwenden und eine echte Sperre verwenden, so kann man atomar inspizieren und die Karte aktualisieren. Tomorrow Sie könnten die Hashtable zu einem Treemap ändern wollen, und Sie werden mit einem Hash-Tabelle in Schwierigkeiten, wenn Ihr stecken sein.

Also, warum fragen Sie? :) Glauben Sie wirklich, dass, wenn Klasse in java.util Paket platziert wird dann etwas Magie und Code funktioniert in einigen kniffligen Weise seine Java passiert?

Es wickelt wirklich nur alle Methoden mit synchronisiertem {} Block und nichts weiter.

UPD:. Der Unterschied ist, dass Sie viel weniger Chancen haben, einen Fehler zu machen, wenn Sie synchronisiert Sammlung verwenden, anstatt alle Synchronisations Sachen zu tun, selbst

UPD 2: wie Sie in Quellen sehen können sie verwenden ‚mutex'-Objekt als Monitor. Wenn Sie Modifikator in Methodensignatur synchronisiert verwenden (das heißt synchronized void doSmth()) aktuelle Instanz des Objekts (das heißt this) als Monitor verwendet. Zwei Blöcke von Code unten sind die gleichen:

1.

synchronized public void doSmth () {
   someLogic ();
   moreLogic ();
}

synchronized public static void doSmthStatic () {
   someStaticLogic ();
   moreStaticLogic ();
}

2.

public void doSmth () {
   synchronized (this) {
      someLogic ();
      moreLogic ();
   }
}

public static void doSmthStatic () {
   synchronized (ClassName.class) {
      someStaticLogic ();
      moreStaticLogic ();
   }
}

Wenn Thread-Sicherheit ist der Fall, verwendet Gleichzeitigkeit Paket Datenstrukturen. die Wrapper-Klasse werden alle Zugriffe auf die Karte in eine sequentielle Warteschlange reduzieren.

a) Threads warten Operationen zu tun, an völlig unterschiedlichen Punkten in der Karte werden für die gleiche Sperre warten. Basierend auf der Anzahl der Threads kann dies die Anwendungsleistung auswirken.

b) Betrachten Verbindung Operationen auf der Karte. eine Hülle mit einer Einzelverriegelung wird nicht helfen. Zum Beispiel. „Schauen Sie, wenn vorhanden, dann fügen Sie“ Art von Operationen. Thema syncronization wird wieder ein Thema werden.

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