AtomicIntegerは公平性を保証しますか? その上のスレッドの先着順の実行順序のような?Victor Grazi の並行アニメーションでのアニメーションの例は、そのような公平性をまったく示していません。私は検索しましたが、決定的なものは何も見つかりませんでした。
3 に答える
いいえ、そのような保証はありません。ある場合は、ドキュメントに記載されています。
あなたがそれについて考えるとき、基本的に比較と交換(または同様のもの)AtomicInteger
の薄いラッパーです。先着順のセマンティクスを保証するには、スレッド間の同期が必要になりますが、これにはコストがかかり、.AtomicInteger
つまり、複数のスレッドがincrementAndGet()
同じアトミック整数を同時に取得しようとしている場合、それらがレースを終了する順序は指定されていません。
その操作があなたがしそうな他のものと比較して非常に速いことは何の価値もありません。これは、競合が発生する可能性が非常に低いため、公平性が問題になる可能性が低いことを意味します。
あなたがそれを20億回(あなたは数秒で行うことができます)と呼ぶならば、それはとにかくオーバーフローします。これが懸念事項である場合は、AtomicLongを使用します。
ソースを見ると、注文保証についてYESとNOの正解が出てきます。どのメソッドが呼び出されているかによって異なります。注文保証をサポートするものもあれば、そうでないものもあります。
次のソースは、呼び出されるメソッドに応じて両方のモードをサポートすることを示しています。
138 /**
139 * Atomically sets the value to the given updated value
140 * if the current value {@code ==} the expected value.
141 *
142 * <p>May <a href="package-summary.html#Spurious">fail spuriously</a>
143 * and does not provide ordering guarantees, so is only rarely an
144 * appropriate alternative to {@code compareAndSet}.
145 *
146 * @param expect the expected value
147 * @param update the new value
148 * @return true if successful.
149 */
150 public final boolean weakCompareAndSet(int expect, int update) {
151 return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
152 }
疑問がある場合はJavaDocを読み、それでも明確でない場合はソースを読んでください。