was ist der Unterschied s / w intrinsische Verriegelung, clientseitige Verriegelung & amp; extrinsische Verriegelung?
Was ist der beste Weg, um eine Thread-sichere Klasse zu erstellen?
Welche Art von Verriegelung ist bevorzugt & amp; Warum?
Ich würde Ihnen wärmstens empfehlen, " Java Concurrency In Practice " von Brian Goetz zu lesen. Es ist ein ausgezeichnetes Buch, das Ihnen helfen wird, alle Konzepte über Nebenläufigkeit zu verstehen!
Über Ihre Fragen bin ich mir nicht sicher, ob ich sie alle beantworten kann, aber ich kann es versuchen. Die meiste Zeit, wenn die Frage ist "Was ist der beste Weg, um zu sperren" etc, ist die Antwort immer davon abhängt, welches Problem Sie versuchen zu lösen.
Frage 1:
Was Sie hier vergleichen möchten, ist nicht genau vergleichbar;
Java bietet einen eingebauten Mechanismus zum Sperren, den synchronized
-Block. Jedes Objekt kann implizit als Sperre für Synchronisationszwecke fungieren; Diese integrierten Sperren werden intrinsische Sperren genannt.
Was für den Begriff intrinsic
interessant ist, ist, dass der Besitz einer Sperre pro Thread und nicht pro Methodenaufruf erfolgt. Das bedeutet, dass nur ein Thread die Sperre zu einem bestimmten Zeitpunkt halten kann. Interessant ist auch der Begriff reentrancy
, der es dem selben Thread ermöglicht, die gleiche Sperre erneut zu erhalten. Intrinsische Sperren sind reentrant.
Clientseitige Sperrung , wenn ich verstehe, was Sie meinen, ist etwas anderes. Wenn Sie keine Thread-sichere Klasse haben, müssen Ihre Kunden sich darum kümmern. Sie müssen Sperren halten, damit sie sicherstellen können, dass es keine Wettlaufbedingungen gibt.
Extrinsic locking ist, anstatt den eingebauten Mechanismus des synchronisierten Blocks zu verwenden, der Ihnen implizite Sperren zur spezifischen Verwendung von expliziten Sperren gibt. Es ist eine etwas raffiniertere Art zu sperren. Es gibt viele Vorteile (zum Beispiel können Sie Prioritäten setzen). Ein guter Ausgangspunkt ist die Java-Dokumentation über Sperren
Frage 2: Es kommt darauf an :) Am einfachsten ist es für mich, zu versuchen, alles unveränderlich zu halten. Wenn etwas unveränderlich ist, muss ich mich nicht mehr um die Thread-Sicherheit kümmern
Frage 3: Ich habe es bei deiner ersten Frage beantwortet.
Explicit - Sperren mit gleichzeitiger Lock-Utilities wie Lock-Schnittstelle. zB - ConcurrentHashMap
Intrinsic - Sperren mit synchronized
.
Sperren der Clientseite - Klassen wie ConcurrentHashMap
unterstützen keine Clientseite, da die get-Methode keine Sperre verwendet. also obwohl Sie eine Sperre über sein Objekt wie synchronisiert (Objekt von ConcurrentHashMap
) setzen, kann noch ein anderer Thread auf das Objekt von ConcurrentHashMap
zugreifen.
Klassen, die alle Methoden zum Abrufen gesetzt haben Explizite oder Intrinsic-Sperren unterstützen das clientseitige Sperren. Als einige Client-Code kommen und sperren Sie das Objekt. Unten ist ein Beispiel für Vector
%Vor%Hier sind einige Links, die die verschiedenen Sperrschemata diskutieren:
Client Side Locking und wann es zu vermeiden
Ich weiß nicht, dass es eine "beste" Möglichkeit gibt, eine Thread-sichere Klasse zu erstellen, es hängt davon ab, was genau Sie erreichen wollen. Normalerweise müssen Sie nicht den ganzen Klassen-Thread sicher machen, sondern nur die Ressourcen schützen, auf die verschiedene Threads Zugriff haben, wie zB allgemeine Listen usw.
Tags und Links java multithreading