Wie man die statische Methode in Java synchronisiert

8

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!

    
Summer_More_More_Tea 02.06.2010, 13:19
quelle

5 Antworten

7

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:

%Vor%

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.

    
Roman 02.06.2010, 13:22
quelle
3

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%     
Mark Pope 02.06.2010 13:27
quelle
2

Ja, statische Methoden werden auf ihrem Klassenobjekt synchronisiert. Ich würde mir hier keine Gedanken über die Leistung machen, da dies wahrscheinlich nicht Ihr Leistungshighlight sein wird. Mach es einfach, optimiere wann und wo du es brauchst.

    
unbeli 02.06.2010 13:22
quelle
2

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.

    
Nathan Hughes 02.06.2010 13:22
quelle
0

Effektives Java empfiehlt die Verwendung von Enums zum Erstellen von Singleton. Du würdest also etwa so aussehen:

%Vor%

}

    
Jhakki 01.07.2010 19:49
quelle