Nun, Sie konnten einen neuen Thread innerhalb des Konstruktors starten. Es wäre sehr ungewöhnlich - und sicherlich in dem Code, den Sie zur Verfügung gestellt haben, wäre es sinnlos - aber es könnte passieren.
Sprachen versuchen normalerweise nicht, jedes mögliche Ding zu finden, das Sie tun könnten, das wäre sinnlos - es würde zu einer sehr komplexen Sprachspezifikation führen. Auch bei den Sprachanwendern muss man sich etwas Gedanken machen ...
Das Synchronisieren auf this
wäre ein Zeichen für eine schlechte Vorgehensweise, da es bedeuten würde, dass this
aus dem Konstruktor herausgelöst wird: Dies ist die einzige Möglichkeit, einen anderen Code für dasselbe Objekt zu synchronisieren.
Das Synchronisieren auf einer anderen gemeinsamen Sperre könnte jedoch legitim sein: Der Konstruktor beinhaltet tatsächlich das Aufrufen von Code, der eine solche Synchronisation erfordert.
Möglicherweise ändern Sie einige allgemeine Daten im Konstruktor, auf die mehrere Threads zugreifen. Allerdings wäre ein besserer und einfacherer Ansatz vorzuziehen.
Unter normalen Bedingungen sollte es keinen Grund geben, warum Sie das tun würden.
Wenn Sie jedoch die this
-Referenz den Konstruktor "entkommen" lassen (das ist natürlich eine schlechte Methode), dann sollten Sie den Client-Code zwingen, auf den Abschluss des synchronisierten Blocks zu warten, bevor andere Operationen aufgerufen werden.
Zum Beispiel:
%Vor% Wenn Sie in diesem Beispiel criticalSection()
in someService
aufrufen, müssen Sie warten, bis der synchronisierte Block im Konstruktor abgeschlossen ist.
Aber das ist nicht zu empfehlen, und Sie sollten this
niemals erlauben, den Konstruktor zu verlassen.
Soweit ich es verstehe, kann es kritisch sein, wenn Sie mit statischen Feldern innerhalb eines Konstruktors arbeiten. Wenn ein Objekt erstellt wird, hat nur der Thread, der es erzeugt, Zugriff auf dieses Objekt, aber im Falle von Änderungen der statischen Feldwerte im Konstruktor kann es ein Problem sein, da zwei verschiedene Threads Objekte der gleichen Klasse gleichzeitig erzeugen können, die Konflikte verursachen zu statischen Feldern. Aber nicht sicher, ob es eine gute Idee ist, dies zum Sperren
zu verwendenEs könnte verwendet werden, um die sichere Veröffentlichung nicht endgültiger Felder im Konstruktor zu gewährleisten.
%Vor% Wenn ein anderer Thread ein Objekt vom Typ Test empfängt und auch für diese Instanz von Test
synchronisiert wird, wird eine "happen-before" -Beziehung zwischen dem Ende des Blocks synchronized
im Konstruktor und dem Anfang von erstellt Der Block synchronized
im anderen Thread:
In der Praxis ist dies jedoch fast nie sinnvoll, da Sie einen Synchronisationsmechanismus benötigen, um die Instanz von Test sicher von einem Thread zu einem anderen zu übergeben, und der Synchronisationsmechanismus führt höchstwahrscheinlich bereits eine Vor-Vor-Beziehung zwischen den Threads ein / p>
Trotzdem könnte es in einer hochspezifischen Parallelitätskomponente verwendet werden.
Tags und Links java synchronization