while と do-while
while と do-while は、ブロックが空の場合は機能的に同等ですが、 while の方が自然に見えます:
do {} while (keepLooping());
while (keepLooping()) {}
空のブロックを使用した while/do-while の典型的な使用例の 1 つは、compareAndSet (CAS) を使用してアトミック オブジェクトを強制的に更新することです。たとえば、次のコードa
はスレッドセーフな方法でインクリメントします。
int i;
AtomicInteger a = new AtomicInteger();
while (!a.compareAndSet(i = a.get(), i + 1)) {}
環境
java.util.concurrent のいくつかの部分ではdo {} while (...)
、CAS 操作にイディオムを使用しており、javadoc で次のようにForkJoinPool
説明されています。
do {} while (!cas...)
CAS された変数の更新を強制する最も簡単な方法である異常な現象がいくつか発生します。
彼らはそれが異常であることを認めているので、彼らは最も単純というよりも最良を意味していたと思います。
質問
do {} while (!cas)
よりも効率的な状況はありwhile (!cas) {}
ますか?その理由は何ですか?