Was nutzt der synchronisierte Block innerhalb des Konstruktors?

8

Wir können den Konstruktor synchronized nicht erstellen, aber wir können synchronized this innerhalb des Konstruktors schreiben. In welchem ​​Fall wird eine solche Anforderung kommen? Ich bin amüsiert.

%Vor%     
sailor 22.02.2013, 10:15
quelle

6 Antworten

11

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 ...

    
Jon Skeet 22.02.2013 10:17
quelle
6

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.

    
Marko Topolnik 22.02.2013 10:18
quelle
0

Möglicherweise ändern Sie einige allgemeine Daten im Konstruktor, auf die mehrere Threads zugreifen. Allerdings wäre ein besserer und einfacherer Ansatz vorzuziehen.

    
Sudhanshu Umalkar 22.02.2013 10:21
quelle
0

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.

    
Costi Ciudatu 22.02.2013 10:23
quelle
0

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 verwenden     
Artem Vorobyev 18.09.2015 20:18
quelle
0

Es 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:

%Vor%

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.

    
Erwin Bolwidt 08.01.2016 08:47
quelle

Tags und Links