19

スレッドのタイトルは自明である必要があります...AtomicBooleanクラスからの以下のメソッドの仕様の間で少し混乱しています:

  • java.util.concurrent.atomic.AtomicBoolean#compareAndSet
  • java.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);
  }
}

現在のフラグ値を取得して自動的に更新したい場合、両方のメソッドで同じ動作が発生するのではないでしょうか?

内部の違いがない場合は、それぞれをいつどのように使用するかについての説明をいただければ幸いです。

4

4 に答える 4

9

理解を深めるためにコードを見ることができます:

public final boolean getAndSet(boolean newValue) {
    for (;;) {
        boolean current = get();
        if (compareAndSet(current, newValue))
            return current;
    }
}

では、古い値を取得してからその値を変更しようとするまでのgetAndSet間にブール値が変更された場合、 はその値を変更しません。したがって、ブール値が新しい値に設定されるまで、呼び出しがループします。get()compareAndSetgetAndSetcompareAndSet

あなたのコード例に関して:

flag.getAndSet(false)AtomicBoolean の古い値を返します。一方、flag.compareAndSet(x,false)(2 つの引数があることに注意してください) は、AtomicBoolean が変更されたかどうかを返します。つまり、AtomicBoolean の古い値が x であったかどうかを返します。

于 2015-01-26T09:47:12.970 に答える
1

実装を確認したところ、次のことがわかりました

public final boolean getAndSet(boolean newValue) {
    for (;;) {
        boolean current = get();
        if (compareAndSet(current, newValue))
            return current;
    }
}

また、javadoc をチェックするときに、単純に値を設定して前の値を返すcompareAndSet一方で、比較がパスした場合にのみ値を設定します。getAndSet

于 2015-01-26T09:46:51.373 に答える