Warum ist flüchtig verwendet in double-checked locking

Vom Kopf Zuerst design-patterns-Buch, das singleton-Muster mit double-checked locking umgesetzt worden ist, wie folgt:

public class Singleton {
    private volatile static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

Ich verstehe nicht, warum volatile verwendet wird. Nicht volatile Nutzung Niederlage der Zweck der Verwendung von double-checked locking ich.e Leistung?

  • Ich dachte, doppelt geprüft Verriegelung gebrochen war, hat man es beheben?
  • Für was es Wert ist, fand ich Head First design patterns zu werden, ein schreckliches Buch, um daraus zu lernen. Als ich mich wieder auf ihn, macht es durchaus Sinn, jetzt, dass ich gelernt habe, das Muster anderswo, sondern zu lernen, ohne zu wissen, die Muster, die es wirklich nicht dienen, es Zweck. Aber es ist sehr beliebt, so war es vielleicht nur mich dichten. 🙂
  • Ich habe gesehen, dieses Beispiel als eine Art, in der die jvm vertraut werden kann zu tun, die DCL.
  • FWIW, auf einem x86-system einen flüchtigen Lesen-Lesen ist, soll in einer nicht-op. In der Tat, die einzige operation, die erfordert, dass ein Zaun für die Speicher-Konsistenz ist ein flüchtiger Schreib-Lese. Also wenn du wirklich nur schreiben, der Wert einmal, dann sollte es nur minimale Auswirkungen. Ich habe nicht gesehen, dass jemand tatsächlich die benchmark und, denken, das Ergebnis wäre interessant!
  • für alle praktischen Gründen, es ist immer noch gebrochen. Es ist besser, mit volatile (wie in "nicht Schrauben Ihrem Programm"), aber dann braucht man auch nicht wirklich viel gewinnen.
  • Na ja, offensichtlich haben wir nur einen Effekt für das schreiben-Lesen (wenn alles, was wir tun, ist zu Lesen, es ist eher uninteressant, die identische Kopie, die wir gerade Lesen), aber "Nur selten führt zu einem Fehler" ist nicht sehr hilfreich, denke ich - eigentlich macht es viel schwieriger, das problem zu identifizieren.
  • Ich habe nie gesagt, "Nur selten die Ergebnisse in ein Fehler", mein Punkt war, dass in der Theorie sollte es nur einen Treffer, um die Leistung kurz nach der Initialisierung.
  • Sie falsch verstanden - ja, ich Stimme zu.
  • Related posts hier und hier über, warum die doppelte überprüfung ist auch erforderlich, in den ersten Platz.

InformationsquelleAutor toc777 | 2011-10-21
Schreibe einen Kommentar