マルチスレッド、すべてのスレッド共有、および単一の AtomicLong 変数でのプロセスを実行するプログラムがあります。それぞれが最初にメソッドを呼び出しgetAndAdd()
て値を取得し、さらに処理します。
すべてのスレッドが同時に実行されている場合、上記のメソッドを呼び出すと、あるスレッドが別のスレッドが値の取得を完了するのを待つことになりますか?
マルチスレッド、すべてのスレッド共有、および単一の AtomicLong 変数でのプロセスを実行するプログラムがあります。それぞれが最初にメソッドを呼び出しgetAndAdd()
て値を取得し、さらに処理します。
すべてのスレッドが同時に実行されている場合、上記のメソッドを呼び出すと、あるスレッドが別のスレッドが値の取得を完了するのを待つことになりますか?
スレッドは ( の意味でObject::wait
) 待っているのではなく、 の取得と追加に成功するまでループしていAtomicLong
ます。
参考までに、JDK 8 のコードは次のようになります。
public final long getAndAddLong(Object o, long offset, long delta) {
long v;
do {
v = getLongVolatile(o, offset);
} while (!compareAndSwapLong(o, offset, v, v + delta));
return v;
}
メソッドが組み込みの場合があることに注意してください (つまり、実行時に、より効率的なもの、通常は単一の CPU 命令に置き換えられます)。