所以我用AtomicLong
,决定去看看它的实现,并发现2种方法之间存在下列区别:Java的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 differen t循环;第一个是while
,第二个是for
。据我所知,这在性能上没有什么区别。这是否有特定的原因?
我认为原因是不同的开发人员在哪里涉及。但是两个循环完全相同。 – Stephan 2012-01-06 13:21:43
我什至不明白为什么他们不会编译成相同的字节码。我需要对此进行测试,但我希望'while(true)'和'for(;;)'产生相同的字节码输出。我唯一能想到的是@ Stephan对不同开发人员的建议,但我不知道如果证明或反驳那些没有访问文件的版本控制历史记录的人。 – 2012-01-06 13:28:07
@Stephan&@Thomas:我曾考虑过这种可能性,但在JDK6源代码中,我只能将Doug Lea看作'@ author',这使我对为什么会以这种方式实现而感到好奇。也许道格正在和我们一起玩。 – tmbrggmn 2012-01-06 13:38:21