while 与 do-while
当块为空时, while 和 do-while 在功能上是等效的,尽管 while 看起来更自然:
do {} while (keepLooping());
while (keepLooping()) {}
带有空块的 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 操作的习语和解释的 javadoc ForkJoinPool
:
有几次出现异常
do {} while (!cas...)
,这是强制更新 CAS 变量的最简单方法。
既然他们承认这很不寻常,我想他们的意思是best而不是simple。
问题
do {} while (!cas)
有没有比这更有效的情况while (!cas) {}
?出于什么原因?