AtomicIntegerは同期を処理しますか?

Aug 17 2020

2つのスレッドが両方ともi ++int iを使用して同じようにインクリメントする場合、i ++はアトミック操作ではないため、問題が発生する可能性があります。そのため、増分をアトミックにするがあります。したがって、1つのコアと2つのスレッドが実行されている場合、まったく問題はありません(操作の途中で中断できないため)。AtomicInteger.increment().increment()

しかし、2つのコアと2つのスレッドがあり、それらが並行して(まったく同時に)それを呼び出すとしincrement()たらどうでしょうか?

同じ値をロードする可能性はありint iますか?つまり、int i1の場合、最終結果は3ではなく2になります。その場合、両方が同時に同じ値をとるので、それがアトミック操作であるかどうかは関係ありません。

結論:同期はAtomicIntegerによって処理されますか?

回答

3 Joni Aug 17 2020 at 12:04

同じ値をロードする可能性はありint iますか?

はい、ありますが、それはあなたのために処理されます。

このincrementAndGetメソッドは、新しい値がまだ設定されていない場合にのみ、増分値を設定するアトミックな「比較と設定」操作を使用します。比較が失敗した場合はincrementAndGet、新しい値をフェッチして再試行します。

正味の効果は、incrementAndGet複数のスレッドから安全に使用できることです。