AtomicIntegerは同期を処理しますか?
Aug 17 2020
2つのスレッドが両方ともi ++int i
を使用して同じようにインクリメントする場合、i ++はアトミック操作ではないため、問題が発生する可能性があります。そのため、増分をアトミックにするがあります。したがって、1つのコアと2つのスレッドが実行されている場合、まったく問題はありません(操作の途中で中断できないため)。AtomicInteger.increment()
.increment()
しかし、2つのコアと2つのスレッドがあり、それらが並行して(まったく同時に)それを呼び出すとしincrement()
たらどうでしょうか?
同じ値をロードする可能性はありint i
ますか?つまり、int i
が1の場合、最終結果は3ではなく2になります。その場合、両方が同時に同じ値をとるので、それがアトミック操作であるかどうかは関係ありません。
結論:同期はAtomicIntegerによって処理されますか?
回答
3 Joni Aug 17 2020 at 12:04
同じ値をロードする可能性はあり
int i
ますか?
はい、ありますが、それはあなたのために処理されます。
このincrementAndGet
メソッドは、新しい値がまだ設定されていない場合にのみ、増分値を設定するアトミックな「比較と設定」操作を使用します。比較が失敗した場合はincrementAndGet
、新しい値をフェッチして再試行します。
正味の効果は、incrementAndGet
複数のスレッドから安全に使用できることです。