而与之相比
当块为空时,while和do-while在功能上是等效的,尽管看起来更自然:
do {} while (keepLooping());
while (keepLooping()) {}
Run Code Online (Sandbox Code Playgroud)
使用空块的while/do-while的一个典型用例是使用compareAndSet(CAS)强制更新原子对象.例如,下面的代码将以a线程安全的方式递增:
int i;
AtomicInteger a = new AtomicInteger();
while (!a.compareAndSet(i = a.get(), i + 1)) {}
Run Code Online (Sandbox Code Playgroud)
上下文
java.util.concurrent的几个部分使用do {} while (...)CAS操作的惯用语和ForkJoinPool解释的javadoc :
有几种异常
do {} while (!cas...)现象是强制更新CAS变量的最简单方法.
既然他们承认这是不寻常的,我认为他们意味着最好而不是最简单.
题
是否存在do {} while (!cas)比while (!cas) {}什么原因更有效的情况?
有谁知道为什么java.util.Spliterator当循环体为空时,实现使用 do-while 而不是 while 循环?例如,其实现forEachRemaining是:
default void forEachRemaining(Consumer<? super T> action) {
do { } while (tryAdvance(action));
}
Run Code Online (Sandbox Code Playgroud)
他们为什么要使用
do { } while (tryAdvance(action));
Run Code Online (Sandbox Code Playgroud)
代替
while(tryAdvance(action));
Run Code Online (Sandbox Code Playgroud)
?
有什么我不知道的优点吗?