Das Doppelüberprüfungsmuster wird in Artikel 48 des Buches Effektiver Java erwähnt, und es wird darauf hingewiesen, dass dieses Muster in Java normalerweise nicht anwendbar ist. Die Struktur dieses Musters ist wie folgt:
öffentliche Ressource getResource () {if (ressourcen == null) {synchronized (this) {if (ressourcen == null) {ressource = new Resource (); }}} Return Resource; }Dieses Muster ist eine Verbesserung des folgenden Code:
public synchronisierte Ressource getResource () {if (ressourcen == null) {ressource = new Resource (); } RECHTEN RESORCE; }Der Zweck dieses Codes besteht darin, die Initialisierung der Ressource zu verzögern. Aber jedes Mal, wenn Sie darauf zugreifen, müssen Sie synchronisieren. Um den Overhead der Synchronisation zu verringern, ist ein Doppelprüfmodus verfügbar.
Der Grund, warum der Doppelprüfmodus in Java ungültig ist, ist, dass der Referenztyp ohne Synchronisation nicht threadssicher ist. Für Basistypen mit Ausnahme von langem und doppeltem, doppeltem Doppelprüfmodus ist anwendbar. Beispielsweise ist der folgende Code korrekt:
private Int Count; public int getCount () {if (count == 0) {synchronized (this) {if (count == 0) {count = computercount (); // eine zeitaufwändige Berechnung}}} Rückgabezahl; }Das obige ist die allgemeine Schlussfolgerung über das doppelte Idiom in Java. Aber die Dinge sind noch nicht vorbei, denn Javas Gedächtnismuster wird ebenfalls verbessert. Doug Lea schrieb in seinem Artikel: "Nach dem neuesten JSR133 -Java -Speichermodell funktioniert der Referenztyp als volatil, der Doppelprüfmodus funktioniert." In Zukunft müssen Sie den Doppelprüfmodus in Java verwenden. Sie können den folgenden Code verwenden:
private volatile Ressourcenressource; öffentliche Ressource getResource () {if (ressourcen == null) {synchronized (this) {if (ressourcen == null) {ressource = new Resource (); }}} Return Resource; }Natürlich muss es in Java sein, die der JSR133 -Spezifikation folgt.
Daher ist Double-Check in J2SE 1.4 oder früheren Versionen aufgrund von Schreibvorgängen außerhalb der Ordnung nicht verfügbar. Dieses Problem wurde in J2SE 5.0 behoben, und das volatile Schlüsselwort kann verwendet werden, um Singletons unter Multi-Threading sicherzustellen.
öffentliche Klasse Singleton {private volatile Singleton Instance = null; public Singleton getInstance () {if (instance == null) {synchronized (this) {if (instance == null) {instance = new Singleton (); }} return Instance; }}Die empfohlene Methode ist die Initialisierung des Inhabers des Bedarfs (IODH).
öffentliche Klasse Singleton {statische Klasse Singletonholder {static Singleton Instance = new Singleton (); } public static singleton getInstance () {return Singletonholder.instance; }}Das obige dreht sich alles um diesen Artikel. Ich hoffe, dass es für alle hilfreich sein wird, Java -Programme zu lernen.