Разница между getAndSet и compareAndSet в AtomicBoolean

Название темы должно быть самообъяснимым ... Я немного запутался между спецификациями нижеприведенных методовAtomicBoolean учебный класс:

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

Моя сборка состоит в том, что оба будут приводить к одинаковому поведению при использовании в качестве логического предложения вif состояние:

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

Предполагая, что я хочу получить текущее значение флага и обновить его автоматически, разве оба метода не должны вызывать одинаковое поведение?

Я был бы очень признателен за любые объяснения относительно того, как и когда использовать каждый из них, если мне не хватает внутренних различий.