Java synchronisieren im singleton-Muster
Funktioniert das synchronisieren Schlüsselwort angewendet werden müssen, um jede Methode einer Klasse, die das singleton-Muster wie dieses?
public class Singleton {
private Singleton(){}
public synchronized static Singleton getInstance()
{
if(instance == null)
instance = new Singleton ();
return instance;
}
public void DoA(){
}
}
Seit Singletons nicht verfügbar, einen öffentlichen Konstruktor und die getInstance () - Methode synchronisiert wird, braucht man nicht zu synchronisieren Methode DoA und anderen öffentlichen Methoden, die das Singleton-Klasse.
Ist diese Argumentation korrekt?
- De Allgemeine Synchronisations-hängt davon ab, ob Sie Zugriff auf die freigegebenen Daten in der Methode.
- Dies sollte Ihre Frage beantworten
- Ich glaube nicht, Wenn getInstance synchronisiert. das bedeutet nicht, dass die DoA-sync. zu.
- Wenn Sie mutieren, shareable state auf die DoA-Methode, dann ja, es kann noch muss Synchronisierung. Was macht die Methode tun ?
- dies ist nichts zu tun, dass man ein singleton
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist genau wie jede andere Klasse. Es kann oder kann keine weitere Synchronisation.
Betrachten Sie das folgende Beispiel:
Wenn die Klasse verwendet werden, von mehreren threads
addToCounter()
hat eine race-Bedingung. Eine Möglichkeit, dies zu beheben ist, indem SieaddToCounter()
synchronisiert:Gibt es andere Möglichkeiten, um fix-race-Bedingung, zum Beispiel durch Verwendung von
AtomicInteger
:Hier haben wir Feste die race-Bedingung, ohne die Verwendung
synchronized
.Gut, der Zweck des Singleton-Klasse ist, dass es maximal eine Instanz von es und dass alle Threads zugreifen können, das gleiche Objekt.
Wenn Sie nicht synchronisieren Sie die
getInstance
Methode könnte das folgende passierenThread1 betritt
getInstance()
Thread2 verzahnt betritt
getInstance()
Thread1 wertet
instance == null
zutrue
Thread2 verzahnt wertet
instance == null
zutrue
Thread1 weist
instance
und gibtThread2 verzahnt reweist
instance = new Singleton()
und zurück.Nun die threads beide haben eine Differenz Instanz der Singleton-Klasse das ist, was verhindert werden sollte, die von diesem Muster.
Synchronisierung verhindert, dass beide Threads zugreifen können, die gleiche code-block zur gleichen Zeit. So ist eine Synchronisation nötig, in einer multithreaded-Umgebung, wenn Sie instanziieren singleton-Klassen.
Nun vorausgesetzt, dass mehrere threads versuchen, Zugriff auf die Singleton-Methoden zur gleichen Zeit-Synchronisation nötig sein könnte, auf diese Methoden. Vor allem, wenn Sie Daten ändern, statt es nur zu Lesen, das ist wahr.
getInstance
.Den richtigen(eigentlich am Besten) Weg, um Singleton -
minstance
passiert null sein, dann sychronizing der block mit dieser Instanz wird das Ergebnis inNullPointerException
.lazy-Initialisierung und thread-sichere Lösung: