Unterschied zwischen getAndSet und compareAndSet in AtomicBoolean

The Thread-Titel sollte selbsterklärend sein ... Ich bin ein bisschen verwirrt zwischen der Spezifikation von unten Methos vonAtomicBoolean class:

java.util.concurrent.atomic.AtomicBoolean#compareAndSetjava.util.concurrent.atomic.AtomicBoolean#getAndSet

Meine Annahme ist, dass beide zu demselben Verhalten führen würden, wenn sie als boolesche Klausel in einem @ verwendet würdeif Bedingung

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);
  }
}

Angenommen, ich möchte den aktuellen Flag-Wert abrufen und automatisch aktualisieren, sollten dann nicht beide Methoden dasselbe Verhalten erzeugen?

Ich würde mich über Erklärungen darüber freuen, wie und wann ich diese verwenden soll, wenn interne Unterschiede fehlen.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage