AtomicInteger の有効な使用例は理解していますが、AtomicBoolean で 2 つのアクションの原子性を保証する方法について混乱しています。「ブール値の変更」およびii。AtomicBoolean変数atomicInitializedの次のよく引用されるユースケースで、initialize()などの「ワンタイムロジック」を実行します。
if (atomicInitialized.compareAndSet(false, true)) {
initialize();
}
この操作は、最初に atomicInitialized を true に設定し (false の場合)、次に intialize() を実行しますが、これは安全ではありません。initialize() が 1 回だけ呼び出されることが保証されますが、getAndSet() にヒットする 2 番目のスレッドは、最初のスレッドが初期化を完了するまで遅延されません。そのため、ブール値の更新で原子性を提供しながら AtomicBoolean は、「if-block」全体の原子性を実際に提供するわけではなく、完全な原子性を実現するには同期/ロック メカニズムを使用する必要があります。したがって、上記のよく引用される一般的なユースケースは、実際にはアトミックではありません!!