Warum kann das nicht eine abstrakte Methode synchronisiert werden?
Las ich in einem thread aus CodeRanch sagen, dass abstrakte Methoden können nicht synchronisiert werden, aufgrund der Tatsache, dass eine abstrakte Klasse kann nicht instanziiert werden, D. H. kein Objekt zu sperren.
Ist dies nicht sinnvoll, da eine abstrakte Klasse ist eine definition (Vertrag) für eine Kind-Klasse. Die abstrakte definition einer synchronisierten Methode nicht gesperrt werden müssen, das Kind tut. Alle abstrakten überschrift geben würde, ist, dass das Kind von muß synchronisieren Sie diese Methode. Ist meine Logik auf das richtige? Wenn nicht, kann jemand erklären, warum ich falsch Liege?
- Es war einfach eine design-Entscheidung. Es war nicht unvermeidlich, dass es endete so, gibt es Argumente pro und Contra. Das argument, dass es kein Objekt zu sperren, ist eindeutig falsch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Kommentar über nicht in der Lage zu instanziieren, die die abstrakte Klasse ist Müll. Da es sich um eine Instanz-Methode Abstrakt sein, es gibt sicherlich ist Referenz konnte abgeschlossen werden. Konkrete Methoden in abstrakten Klassen kann immer noch auf
this
. Allerdings, das noch nicht bedeutet, dass abstrakte Klassen sollten in der Lage sein werden synchronisiert.Ob oder nicht eine Methode ist synchronisiert, ist eine detail der Methode. Die Synchronisation ist nicht angegeben überall als deklarative Vertrag - es ist nicht so, Sie können die Synchronisierung der Schnittstellen, entweder.
Wie eine Klasse implementiert, was auch immer thread-Sicherheit garantiert, die es bietet, ist es bis zu. Wenn eine abstrakte Klasse will Mandat eine Besondere Herangehensweise, sollten Sie der template Methode-Muster:
Das ist ziemlich gefährlich, selbst aber, da es effektiv Aufruf von "unbekannten" code innerhalb einer Schleuse, die ein Rezept für deadlocks etc.
Sorry, es macht keinen Sinn, das ist nur, wie es funktioniert. Locking-Verhalten kann nicht angegeben werden abstrakte Methoden oder Methoden der Schnittstelle, es ist nicht Teil des Vertrages. Wahrscheinlich wurde die Idee, das locking-Verhalten ist grundsätzlich Teil der Implementierung: unterschiedliche Implementierungen durchführen möchten, sperren anders-und es wäre übersteigerte angeben, um auf dieser Ebene der Abstraktion.
ist definiert als äquivalent zu
(wenn statisch, synchronisiert auf die Klasse statt
this
)Da eine abstrakte Methode keinen Rumpf hat,
synchronized
Schlüsselwort für die Methode undefiniert ist.Ich denke, dass eine Logik dahinter könnte sein, dass, ob oder nicht zu synchronisieren, die Methode sollte entschieden werden, durch die Umsetzung Klasse. Bedeutung, es gibt Ihnen die Freiheit, um die Durchführung zu wählen, ob, um eine synchronisierte oder nicht synchronisierte Umsetzung. Plus, der client müsste auch die option zu wählen, die nicht synchronisierte version, um zu vermeiden, Synchronisations-overhead, wenn die thread-Sicherheit ist nicht ein Problem.