Ich habe diese Frage beim Implementieren eines Singleton-Musters in Java. Auch wenn das unten aufgeführte Beispiel nicht mein richtiger Code ist, aber dem Original sehr ähnlich ist.
%Vor%Da ich mir über das Verhalten einer statischen Synchronisierungsmethode nicht im Klaren bin, bekomme ich Vorschläge von Google - nicht (oder so wenig wie möglich) mehrere statische synchronisierte Methoden in derselben Klasse. Ich denke, wenn eine statische synchronisierte Methode implementiert wird, wird eine Sperre zum Klassenobjekt verwendet, so dass mehrere statische synchronisierte Methoden die Leistung des Systems beeinträchtigen können.
Habe ich Recht? oder verwendet JVM einen anderen Mechanismus zur Implementierung der statischen Synchronisierungsmethode? Was ist die beste Vorgehensweise, wenn ich mehrere statische synchronisierte Methoden in einer Klasse implementieren muss?
Danke euch allen!
Liebe Grüße!
Der beste Ansatz (der so wenig Änderungen wie möglich an Ihrem Code vornimmt) besteht darin, Folgendes zu tun:
%Vor% Wie Sie sehen können, gibt es in getInstance
method jetzt keinen wirklichen Bedarf, so dass Sie den Code vereinfachen können:
UPD über Synchronisation: Der beste Weg ist die Synchronisation auf eine Sperre, die für äußere Klassen nicht sichtbar ist, d. h.
%Vor% Es gibt viele Diskussionen darüber, "warum die Synchronisierung auf this
eine schlechte Idee ist" (wie diese Frage) ), ich denke, dass das gleiche für die Synchronisierung im Unterricht ist.
Es gibt verschiedene Möglichkeiten, ein Singleton zu erstellen.
Eine empfohlene Methode ist die Verwendung einer Enumeration (die garantiert nur eine Instanz erzeugt):
%Vor%Oder Sie können es statisch erstellen, wenn die Klasse geladen wird:
%Vor%Wenn Sie es faul laden müssen, können Sie dieses Idiom verwenden (und nicht das doppelt überprüfte Sperr-Anti-Muster )
%Vor%Statisch synchronisierte Methoden verwenden die Sperre für die Klasse. Im Fall Ihres Beispiels würde es auf die Sperre für das ConnectionFactory-Klassenobjekt zugreifen. Es empfiehlt sich, Schlösser nicht länger als nötig festzuhalten. Ob Sie mehrere synchronisierte Methoden haben, ist kein Problem für sich.
Tags und Links java multithreading concurrency static synchronized