Frage

Dies ist, was zur Zeit mein Code wie folgt aussieht:

private boolean[] isInitialized = new boolean[COUNT];

private void ensureInitialized(int i) {
    if (! isInitialized[i]) {
        initialize(i);
        isInitialized[i] = true;
    }
}

Jetzt will ich es haben Thread-sicher. Ich weiß, dass doppelt geprüft sichernd in Java ist „teh 3vilness !! 1“, aber da ensureInitialized sehr oft genannt werden kann, ich will sie nicht synchronisiert werden. Also ich denke, dies zu tun:

private boolean[] isInitialized = new boolean[COUNT];

private void ensureInitialized(int i) {
    if (! isInitialized[i]) {
        synchronized (this) {
            if (! isInitialized[i]) {
                initialize(i);
                isInitialized[i] = true;
            }
        }
    }
}

Nun, was muss ich tun dies tatsächlich zu machen Thread-sicher?
Einige Teilfragen:

  • machen isInitialized flüchtig ist nicht notwendig, da die Variable nicht geändert wird, nicht wahr?
  • Die Array-Elemente geändert werden, wie kann ich diese flüchtig machen?
  • Gibt es im Allgemeinen bessere Möglichkeiten, dies zu tun?

(Beachten Sie auch, dass dies eine Instanz-Methode, so statische Initialisierer wird keine Arbeit)

War es hilfreich?

Lösung

Bitte beachten Sie, dass Java-Implementierung von doppelter Kontrolle wird als „gebrochene Muster“, weil es als Nicht-Bestanden bewiesen wurde (siehe zum Beispiel: http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html ). Um Arbeit um nur atomare Operation verwenden. Folgen ist Probe, wie Build Thread-sicher Singletons:

static AtomicReferenceArray<Boolean> instance = 
   new AtomicReferenceArray<Boolean>(COUNT);

private void ensure(int i)
{
    if(!instance.get(i) )
    {
        synchronized(this){
        if( !instance.get(i) ){
           initialize(i);
           instance.set(i, true);
        }
    }
}

Andere Tipps

Sie könnten auch erwägen Suppliers.memoize(Supplier<T> delegate) von Guave Bibliothek .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top