While vs. do-while
While and do-while are functionally equivalent when the blocks are empty, although while seems more natural:
do {} while (keepLooping());
while (keepLooping()) {}
One typical use case of a while/do-while with an empty block is to force an update of atomic objects with a compareAndSet (CAS). For example the code below will increment a
in a thread-safe way:
int i;
AtomicInteger a = new AtomicInteger();
while (!a.compareAndSet(i = a.get(), i + 1)) {}
Context
Several parts of java.util.concurrent use the do {} while (...)
idiom for CAS operations and the javadoc of ForkJoinPool
explains:
There are several occurrences of the unusual
do {} while (!cas...)
which is the simplest way to force an update of a CAS'ed variable.
Since they admit it is unusual, I suppose they meant best rather than simplest.
Question
Are there situations where do {} while (!cas)
can be more efficient than while (!cas) {}
and for what reasons?