While与Do-while
当代码块为空时,while和do-while是功能上等同的,尽管while看起来更加自然:
do {} while (keepLooping());
while (keepLooping()) {}
在it技术中,while/do-while结构内空块的典型应用是使用compareAndSet(CAS)强制更新原子对象。例如,下面的代码将以线程安全的方式增加a
的值:
int i;
AtomicInteger a = new AtomicInteger();
while (!a.compareAndSet(i = a.get(), i + 1)) {}
背景
java.util.concurrent 的几个部分使用 do {} while (...)
这种方式进行 CAS 操作,ForkJoinPool
的 javadoc 解释道:
有几个不寻常的
do {} while (!cas...)
出现,这是强制更新 CAS 变量的最简单方法。
既然他们承认这是不寻常的,我想他们可能是指最好而不是最简单。
问题
在什么情况下,do {} while (!cas)
可能比 while (!cas) {}
更有效,并出于什么原因?
{}
呢---我会写成while (condition);
。 - Marko Topolnik