Diferença entre getAndSet e compareAndSet em AtomicBoolean

O título do tópico deve ser auto-explicativo ... Estou um pouco confuso entre a especificação dos methos abaixo deAtomicBoolean classe:

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

Minha suposição é que ambos resultariam no mesmo comportamento quando usados como uma cláusula booleana em umif condição:

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

Supondo que eu queira recuperar o valor do sinalizador atual e atualizá-lo automaticamente, os dois métodos não devem produzir o mesmo comportamento?

Eu apreciaria muito todas as explicações sobre como e quando usar cada uma delas, se estiver faltando diferenças internas.

questionAnswers(4)

yourAnswerToTheQuestion