3

Kleine Frage zur Sichtbarkeit des Speichers.Gewährleisten atomare Variablen die Sichtbarkeit des Speichers?

CodeSample1:

class CustomLock { 

    private boolean locked = false; 

    public boolean lock() { 
     if(!locked) { 
      locked = true; 
      return true; 
     } 
     return false; 
    } 
} 

Dieser Code ist anfällig für Fehler in einer Multithread-Umgebung, zunächst wegen des „if-then-Akt“, das nicht atomar ist, und zweitens wegen des möglichen Speichers Sichtbarkeitsprobleme, bei denen beispielsweise threadA das Feld auf true setzt, threadB, das später den Wert des Felds lesen möchte, sieht dies möglicherweise nicht und sieht immer noch den Wert false.

Die einfachste Lösung ist die Verwendung des synchronisierten Schlüsselworts, wie in CodeSample2.

CodeSample2:

class CustomLock { 

    private boolean locked = false; 

    public synchronized boolean lock() { 
     if(!locked) { 
      locked = true; 
      return true; 
     } 
     return false; 
    } 
} 

Was nun, wenn ich möchte eine atomare Variable, und für das Beispiel verwenden, wird eine AtomicBoolean (Frage gilt für alle atomaren Variablen),

CodeSample3:

public static class CustomLock { 
    private AtomicBoolean locked = new AtomicBoolean(false); 

    public boolean lock() { 
     return locked.compareAndSet(false, true); 
    } 
} 

Bessere Leistungsüberlegungen beiseite, wir können s ee, dass wir jetzt eine ähnliche Logik implementiert haben wie die "Wenn-Dann-Tat" von CodeSample1, mit AtomicBoolean. Es spielt keine Rolle, wirklich, was der Code logisch tut, die Frage, die ich habe, ist was passiert, wenn zwei Threads die Sperre() -Methode in CodeSample3 rechts etwa zur gleichen Zeit aufrufen, während es, dass jeder Schreibvorgang klar ist, zu das Feld wird nun atomar ausgeführt, garantiert die Verwendung von AtomicBoolean auch die Sichtbarkeit des Speichers?

Sorry für die lange Geschichte, wollte nur sicherstellen, dass ich ganz so klar wie möglich komme, Danke Jungs ...

Antwort

0

die Frage, die ich habe, ist was passiert, wenn zwei Threads die Sperre() -Methode in CodeSample3 rechts etwa zur gleichen Zeit aufrufen, während es klar ist, dass jeder Schreibvorgang auf dem Gebiet wird nun durchgeführt werden garantiert atomicBoolean atomar auch die Sichtbarkeit des Speichers?

Für AtomicBoolean Speicher Sichtbarkeit zu gewährleisten, hat es mehrere Operationen von verschiedenen Threads zur selben Zeit zu handhaben. Es kann die Garantie stellen, da es ein Feld volatile umschließt. Es ist die Sprachsemantik der volatile, die sicherstellt, dass Speicherbarrieren überschritten werden, so dass mehrere Threads den aktuellsten Wert sehen und dass alle Updates im Hauptspeicher veröffentlicht werden.

BTW, Ihre lock(...) Methode sollte tryLock(...) bereit sein, weil es nicht die Sperre tun könnte.

Verwandte Themen