Unterschied zwischen getAndSet und compareAndSet in AtomicBoolean
Den thread-Titel sollte selbsterklärend sein explnatory... ich bin ein bisschen verwirrt zwischen der Spezifikation von unten methos aus AtomicBoolean
Klasse:
java.util.concurrent.atomic.AtomicBoolean#compareAndSet
java.util.concurrent.atomic.AtomicBoolean#getAndSet
Meine assemption ist, dass Ergebnis wäre das gleiche Verhalten, wenn verwendet, wie eine Boolesche Klausel in einem if
Zustand:
public class Test {
private AtomicBoolean flag = AtomicBoolean(false);
public void processSomeAction() {
if (flag.getAndSet(false)) { //Shouldn't this be similar to flag.compareAndSet(false)
//process some action
}
}
//...
private void internalMutatorMethod() {
//do some staff then update the atomic flag
flas.set(true);
}
}
Wenn ich zum abrufen der aktuellen flag-Wert und aktualisieren Sie es automaticlly, sollten nicht beide Methoden liefern das gleiche Verhalten?
Ich würde sehr schätzen alle Erläuterungen, wie und Wann jeder von denen, wenn ich bin fehlen die internen Unterschiede.
- compareAndSet hat zwei argument. Die javadoc-zeigt an, dass es völlig anders aus getAndSet. - Sie können schreiben, ein Anruf für compareAndSet, die macht das gleiche wie getAndSet, aber das ist kaum der Rede Wert die Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Dokumentation ist ziemlich klar.
getAndSet
--> "Atomar-sets auf den angegebenen Wert und gibt den vorherigen Wert."compareAndSet
--> "Atomar" setzt den Wert um den angegebenen Wert aktualisiert, wenn der aktuelle Wert == der erwartete Wert."Nicht überraschend,
compareAndSet
nimmt zwei Argumente.In Ihrem speziellen Fall:
if (flag.getAndSet(false))
wird festgelegtflag
zufalse
nur, wenn der Vorherige Wert wartrue
if (flag.compareAndSet(true, false))
Kann man sich den code zum besseren Verständnis :
In
getAndSet
, wenn der Wert des booleschen hat sich verändert zwischen der Zeit, die Sieget()
den alten Wert und die Zeit, die Sie versuchen, um den Wert zu ändern,compareAndSet
wird sich nicht ändern Ihren Wert. DahergetAndSet
AnrufecompareAndSet
in einer Schleife, bis der Boolesche Wert auf den neuen Wert eingestellt.Als code Beispiel :
flag.getAndSet(false)
liefert den alten Wert der AtomicBoolean. Auf der anderen Seiteflag.compareAndSet(x,false)
(Hinweis: es gibt zwei Argumente) gibt an, ob die AtomicBoolean geändert wurde, oder in anderen Worten, es gibt an, ob der alte Wert der AtomicBoolean war x.Wenn ich überprüft die Umsetzung fand ich folgenden
Auch bei der überprüfung der javadoc
compareAndSet
setzt den Wert nur, wenn der Vergleich: währendgetAndSet
einfach den Wert und den vorherigen Wert wiederherzustellen.Der thread ist ein bisschen alt, aber niemand erwähnt, dass getAndSet wird effizienter sein als die compareAndSet.
CAS ist eine sehr kostspielige Unterricht (auf allen CPU-Architekturen, so JVM spielt keine Rolle hier). Sie sind also nicht wirklich entspricht.
Also bezüglich der OP, beide Methoden liefern das gleiche Verhalten, aber es wird nicht die gleiche Leistung getAndSet, wenn Sie können.