Frage

Wann bevorzugt das private Lock -Objekt, um einen Block über das intrinsische Schloss zu synchronisieren (dies)? Bitte zitieren Sie die Upshots von beidem.

privates Schlossobjekt:-

Object lock =new Object();  
synchronized(lock)
{  }

Intrinsic Lock (this):-

synchronized(this)
{  }
War es hilfreich?

Lösung

Verwendung explizit lock Objekte können verschiedene Methoden ermöglichen, um verschiedene Schlösser zu synchronisieren und unnötige Streitigkeiten zu vermeiden. Außerdem wird das Schloss expliziter und kann es einfacher machen, den Code nach Blöcken zu durchsuchen, die das Schloss verwenden.

Sie wollen jedoch wahrscheinlich auch nicht! Finden Sie die entsprechende Klasse in java.util.concurrent und verwenden Sie diese stattdessen. :)

Andere Tipps

Ein privates Schloss kann nützlich sein, wenn Sie eine Art Schloss -Sharding durchführen.

Eine einfache Parallele zum Verständnis dieses Konzepts ist eine Tabellensperrung in einer Datenbank: Wenn Sie eine Tabelle ändern, erwerben Sie die Sperre für diese einzelne Tabelle, nicht die gesamte Datenbank, sodass der Rest der Tabellen von anderen Clients geändert werden kann. Wenn Sie eine ähnliche Logik implementieren müssen, aber in einem Pojo so viele private Schlösser wie nötig verwenden würden.

Ein Nachteil dieses Ansatzes ist, dass Ihre Klasse mit vielen Objekten überfüllt wird. Dies könnte ein Hinweis darauf sein, dass Sie es in einem detaillierteren Satz von Klassen mit einer einfacheren Sperrenstrategie neu umsetzen müssen, aber alles hängt von Ihrem Design und Ihrer Implementierung ab.

Diese verwenden beide intrinsische Schlösser. Ihr erstes Beispiel ist die Verwendung des intrinsischen Schlosses von lock, während der zweite das intrinsische Schloss von verwendet this. Die Frage ist, ob oder nicht this ist wirklich das, was Sie einschließen möchten, was es oft nicht ist.

Betrachten Sie den Fall, wenn Sie verwenden synchronized(this) In einer Ihrer Methoden. Sie haben 2 Objekte dieser Klasse, und diese Objekte verweisen auf eine gemeinsame Ressource. Wenn Sie einsperren this Dann haben Sie keine gegenseitige Exklusivität für diese Ressource. Sie müssen ein Objekt festlegen, auf das alles, was auf die Ressource zugreifen kann, Zugriff hat.

Sperren this Nur wenn die wichtige Ressource Teil der Klasse selbst ist. Selbst dann ist in einigen Fällen ein Sperrobjekt besser. Wenn es in Ihrer Klasse verschiedene Ressourcen gibt, die sich nicht gegenseitig als Ganzes, sondern einzeln ausschließen müssen, benötigen Sie mehrere Sperrobjekte.

Der Schlüssel ist, wirklich nur zu wissen, wie synchronisiert funktioniert und achten Sie darauf, was Ihr Code tatsächlich tut

Tatsächlich macht es keinen Unterschied, es geht mehr um Auswahl/Stil. API -Autoren werden das Objekt einschließen -E entweder durch synchronisierte (this) oder explizit synchronisiert auf einer Objektmethode-, oder verwenden Sie einen internen Monitor abhängig von der Freigabe einer Ressource. Sie möchten möglicherweise nicht, dass API -Benutzer auf Ihr internes Sperre zugreifen, oder möchten API -Benutzern möglicherweise die Wahl geben, das intrinsische Lock des Objekts zu teilen.

In beiden Fällen ist keine dieser Entscheidungen falsch, es geht mehr um die Absicht eines solchen Schlosses.

Lesen Java Parallelität in der Praxis, Das macht Sie zu einem Meister der Parallelität und klärt viele dieser Konzepte, die manchmal eher mit der Wahl zusammenhängen, die Sie treffen, als mit der Richtigkeit.

Jedes Objekt hat nur eine intrinsische Schloss.

Mit dem synchronisierten Schlüsselwort: Wenn Sie zwei synchronisierte Methoden aus demselben Objekt aus zwei verschiedenen Threads aufrufen, kann ein ausgedehnter Thread die Methode ausführen und der andere Thread kann die Methode zwei ausführen, da beide Methoden dieselbe intrinsische Sperre teilen (die zum der gehört Objekt). Und laut diesem einen Thread muss es warten, bis der andere Faden fertiggestellt wird, bevor er das intrinsische Schloss erwerben kann, um die andere Methode auszuführen.

Aber wenn Sie mehrere Schlösser verwenden, Sie werden sicherstellen, dass nur ein Thread einzeln auf Methode zugreifen kann und dass nur ein Thread auf die Methode zwei zugreifen kann. Sie werden jedoch zulassen, dass die Methode eins und Methode zwei gleichzeitig mit jeweils einem Thread zugegriffen werden und dann die für den Vorgang erforderliche Zeit verkürzt.

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