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?
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:
Es gibt andere Möglichkeiten, die Wettlaufsituation zu beheben, zum Beispiel mit AtomicInteger
:
Hier haben wir die Racebedingung ohne synchronized
behoben.
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()
Thread2 gibt getInstance()
Thread1 wertet instance == null
auf true
Thread2 wertet instance == null
auf true
Thread1 weist instance
zu und gibt
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.
Die richtige (beste tatsächlich) Art, Singleton zu verwenden
%Vor%Tags und Links java synchronization singleton