Java的AtomicLong实现循环

时间:2012-01-06 13:18:05

标签: java loops atomic

所以我使用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。据我所知,这对性能没有影响。这有什么特别的原因吗?

4 个答案:

答案 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(;;)可能会让初学者感到困惑,但这更多的是风格问题。