Java im Singleton-Muster synchronisieren

8

Muss das Synchronize-Schlüsselwort auf jede Methode einer Klasse angewendet werden, die das Singleton-Muster wie folgt implementiert?

%Vor%

Da Singletons keinen öffentlichen Konstruktor verfügbar machen und die Methode getInstance () synchronisiert wird, muss die Methode DoA und alle anderen von der Singleton-Klasse offengelegten öffentlichen Methoden nicht synchronisiert werden.

Stimmt diese Argumentation?

    
Klaus Nji 10.04.2013, 15:51
quelle

4 Antworten

16

Es ist wie jede andere Klasse. Es kann oder muss nicht weiter synchronisiert werden.

Betrachten Sie das folgende Beispiel:

%Vor%

Wenn die Klasse aus mehreren Threads verwendet werden soll, hat addToCounter() eine Racebedingung. Eine Möglichkeit, dies zu beheben, besteht darin, addToCounter() synchronisiert zu machen:

%Vor%

Es gibt andere Möglichkeiten, die Wettlaufsituation zu beheben, zum Beispiel mit AtomicInteger :

%Vor%

Hier haben wir die Racebedingung ohne synchronized behoben.

    
NPE 10.04.2013, 16:01
quelle
9

Nun, der Zweck der Singleton-Klasse ist, dass es höchstens eine Instanz davon gibt und dass alle Threads auf dasselbe Objekt zugreifen können.

Wenn Sie die Methode getInstance nicht synchronisieren würden, könnte Folgendes passieren:

Thread1 gibt getInstance()

ein

Thread2 gibt getInstance()

ein

Thread1 wertet instance == null auf true

aus

Thread2 wertet instance == null auf true

aus

Thread1 weist instance zu und gibt

zurück

Thread2 re weist instance = new Singleton() zu und gibt zurück.

Nun haben die Threads beide eine Unterscheidungsinstanz der Singleton-Klasse, die durch dieses Muster verhindert werden sollte.

Die Synchronisierung verhindert, dass beide Threads gleichzeitig auf denselben Codeblock zugreifen können. Daher wird eine Synchronisierung in einer Multithread-Umgebung benötigt, wenn Sie Singleton-Klassen instanziieren.

Wenn nun davon ausgegangen wird, dass mehrere Threads versuchen werden, gleichzeitig auf die Singletons-Methoden zuzugreifen, ist möglicherweise auch bei diesen Methoden eine Synchronisation erforderlich. Besonders wenn sie Daten ändern, anstatt nur zu lesen, ist dies wahr.

    
DeltaLima 10.04.2013 16:04
quelle
1

Die richtige (beste tatsächlich) Art, Singleton zu verwenden

%Vor%     
gaurav414u 20.03.2015 05:09
quelle
1

Lazy Initialization und thread safe solution:

%Vor%     
Flinbor 17.10.2015 07:55
quelle

Tags und Links