相关疑难解决方法(0)

在什么情况下可以做 - 虽然比在什么时候更有效?

而与之相比

块为空时,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 performance while-loop do-while compare-and-swap

8
推荐指数
1
解决办法
1627
查看次数

Java 8 Spliterator 中使用的奇怪循环

有谁知道为什么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)

有什么我不知道的优点吗?

java java-8 spliterator

5
推荐指数
1
解决办法
338
查看次数