1. ホーム

[解決済み】Volatile booleanとAtomicBooleanの比較

2022-04-19 02:34:33

質問

AtomicBooleanは、volatile booleanでは実現できない、どのようなことをするのですか?

どのように解決するのですか?

全く違うだけなのです。この例で考えてみましょう。 volatile の整数になります。

volatile int i = 0;
void incIBy5() {
    i += 5;
}

2つのスレッドが同時に関数を呼び出す場合。 i というのは、コンパイルされたコードはこれと多少似ているからです。 int ):

void incIBy5() {
    int temp;
    synchronized(i) { temp = i }
    synchronized(i) { i = temp + 5 }
}

変数がvolatileの場合、その変数へのアトミックなアクセスはすべて同期化されますが、実際に何がアトミックなアクセスに該当するかは必ずしも明らかではありません。しかし Atomic* オブジェクトの場合、すべてのメソッドがアトミックであることが保証されています。

したがって、もし AtomicIntegergetAndAdd(int delta) になることは間違いありません。 10 . 同じように、2つのスレッドがともに boolean 変数が同時に AtomicBoolean を使用すると、後で元の値を持っていることを確認することができます。 volatile boolean しかし、それはできません。

そのため 複数のスレッド フィールドを変更する場合は、アトミックにするか、明示的な同期を使用する必要があります。

の目的は volatile は別のものです。この例を考えてみましょう。

volatile boolean stop = false;
void loop() {
    while (!stop) { ... }
}
void stop() { stop = true; }

スレッドが実行されている場合 loop() を呼び出すスレッドと stop() を省略した場合、無限ループに陥る可能性があります。 volatile 最初のスレッドがstopの値をキャッシュしているかもしれないからです。ここでは volatile は、コンパイラに最適化をもう少し慎重に行うようにというヒントを与えているのです。