singleton und öffentliche statische variable in Java
Habe ich 2 Optionen:
-
Singleton-Muster
class Singleton{ private static Singleton singleton = null; public static synchronized Singleton getInstance(){ if(singleton == null){ singleton = new Singleton(); } return singleton; } }
-
mit einem
static final
Feldprivate static final Singleton singleton = new Singleton(); public static Singleton getSingleton() { return singleton; }
Was ist der Unterschied? (Single-Threaded oder multithreaded)
Updates: ich bin mir bewusst, Bill Pugh oder enum
Methode.
Ich bin nicht auf der Suche nach dem richtigen Weg, aber ich habe nur 1. Gibt es eigentlich einen Unterschied b/w 1 oder 2?
- Nachdem Ihre aktualisierte Frage keinen Unterschied.
- diese Frage ist nichts mit singleton. Sie Fragen über den Zugriff auf ein statisches Feld von synchronisiert/nicht synchronisiert Kontext. edit-tags bitte.
- Bin ich anderer Meinung als die erste option zu sperren, jeden thread, der versucht, um die Instanz und ist daher etwas weniger performant.
- seine nicht gute Praxis zu verwenden
synchronized
eine alle Ihre Methode.synchronized
die Umsetzung ist sehr teuer. Ich veröffentlichte unter anderem eine bessere Art und Weise zu verwenden Singleton-für multithreading
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Hauptunterschied ist, dass mit der ersten option wird die singleton wird nur initialisiert werden, wenn
getInstance
genannt wird, in der Erwägung, dass die zweite option, es wird initialisiert, sobald der enthaltenden Klasse geladen wird.Einen Dritten (bevorzugt) - option, die ist faul und thread-sicher ist die Verwendung einer enum:
Einen Unterschied gibt es allerdings:
Lösung 1 ist eine lazy-Initialisierung der singleton-Instanz erzeugt, auf den ersten aufrufen von
getInstance
Lösung 2 ist ein begierig Initialisierung der singleton-Instanz wird erstellt, wenn die Klasse loades
Beide sind thread-sicher, ruft die zweite multi-threaded ist ein wenig irreführend
Dem 1. Lösungen zu sein scheint fauler, aber eigentlich nicht.
Einer Klasse initialisiert wird, wenn eine statische Methode/Feld über für die 1. Zeit.
Ist es wahrscheinlich, dass
getInstance()
ist der einzige öffentlich zugängliche statische Methode/Feld der Klasse. Das ist der Sinn von singleton.Dann wird die Klasse initialisiert wird, wenn jemand anruft
getInstance()
zum 1. mal. Das bedeutet, dass die beiden Lösungen sind im wesentlichen die gleichen in der Faulheit.Natürlich die 2. - Lösungen sieht besser und besser.
So, mit dem update beide oben genannten Optionen sind thread-sicher. Aber die
synchronized
- option erfordert, dass jeder thread, der nenntinstance
diese Sperre erwerben und dadurch die Leistung reduziert, wenn dies eine Menge getan. Auch mitsynchronized
im level Methode das potential hat, die Frage der Verwendung eines öffentlich zugänglichen Sperre (die Klasse selbst), dass deshalb, wenn einige thread, erwirbt diese Sperre (was es könnte), könnten Sie am Ende mit deadlock. Diestatic final
option ist schneller, aber nicht die verzögerte Initialisierung des Singletons (das könnte nicht ein Problem sein, je nach system).Andere option, mit der thread-safe, lazy init des Singleton ist wie folgt:
Dies funktioniert, da die statische innere Klasse ist garantiert initialisiert werden, bevor Sie jede Methode in der übergeordneten Klasse ausgeführt wird.
Singleton-Implementierung in Java (wenn Sie wirklich wollen, dass) durchgeführt werden können, in eine elegantere Möglichkeit, als die Sie beschrieben für beide eager und lazy initialization. Überprüfen Sie der enum-Weg beschrieben von Joshua Bloch und die SingletonHolder Lösung vorgeschlagen von Bill Pugh bzw.
Wikipedia-Artikel ist auch ein guter start für das Verständnis der Muster und nicht die Antwort auf Ihre Frage.