所以我使用AtomicLong
并决定查看其实现,并注意到以下两种方法之间存在以下差异:
getAndAdd(long delta)
:
public final long getAndAdd(long delta) {
while (true) {
long current = get();
long next = current + delta;
if (compareAndSet(current, next))
return current;
}
}
incrementAndGet()
:
public final long incrementAndGet() {
for (;;) {
long current = get();
long next = current + 1;
if (compareAndSet(current, next))
return next;
}
}
令我感到奇怪的是,两种方法几乎完全相同,但它们是使用2个不同的循环实现的;第一个是while
,第二个是for
。据我所知,这对性能没有影响。这有什么特别的原因吗?
答案 0 :(得分:3)
不,在Java中只有两种表达无限循环的方法。普遍认为没有人会更好。
答案 1 :(得分:2)
在向原作者询问为什么以这种方式实施之后,这就是他回答的问题:
我总是使用“for(;;)”(发音为“forever”), 合作时除外(在这种情况下与 JVM伙伴们,出于某些愚蠢的原因,他们更喜欢“while(true)”。
总结一下:for(;;) {}
和while(true) {}
之间没有区别,两者在AtomicLong
中互换使用的原因是因为不同的作者更喜欢不同的语法。
答案 2 :(得分:1)
您可能想要检查生成的字节码。如果相同,我不会感到惊讶。
也许他们来自不同的作者或不同的情绪...当我写了很多for循环时,我可能会使用for(;;) {
语法,当花费太多时间写循环时,我会使用while(true) {
。
答案 3 :(得分:1)
while(true)
和for(;;)
之间没有区别,两者都应生成相同的字节码(您可以使用javap进行检查)。有些人可能会说你应该使用while(true)
,因为for(;;)
可能会让初学者感到困惑,但这更多的是风格问题。