2012-01-06 152 views
2

所以我用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。据我所知,这在性能上没有什么区别。这是否有特定的原因?

+7

我认为原因是不同的开发人员在哪里涉及。但是两个循环完全相同。 – Stephan 2012-01-06 13:21:43

+1

我什至不明白为什么他们不会编译成相同的字节码。我需要对此进行测试,但我希望'while(true)'和'for(;;)'产生相同的字节码输出。我唯一能想到的是@ Stephan对不同开发人员的建议,但我不知道如果证明或反驳那些没有访问文件的版本控制历史记录的人。 – 2012-01-06 13:28:07

+0

@Stephan&@Thomas:我曾考虑过这种可能性,但在JDK6源代码中,我只能将Doug Lea看作'@ author',这使我对为什么会以这种方式实现而感到好奇。也许道格正在和我们一起玩。 – tmbrggmn 2012-01-06 13:38:21

回答

2

问为什么以这种方式实现的原作者之后,这是他的回答是:

我总是使用“为(;;)”(发音为“永远”), 时除外合作(在这种情况下与 JVM人)谁为一些愚蠢的原因喜欢“while(true)”。

总结:有for(;;) {}while(true) {},为什么两者交替使用在AtomicLong是因为不同的作者首选的不同语法的原因没有区别。

3

不,在Java中只有两种表达无限循环的方式。没有人普遍认为是更好的。

+0

+1:Plus'do {/ * * /} while(true);'实际上无限循环有无数的可能实现。 ;) – 2012-01-06 13:29:02

1

您可能想要检查生成的字节码。如果它是相同的,我不会感到惊讶。

也许他们来自不同的作者或不同的心情......当我为循环编写大量文档时,我可能会使用for(;;) {语法,当在循环中编写太多时间时,我会使用while(true) {

1

while(true)for(;;)之间没有区别,它们都应该产生相同的字节码(可以用javap检查)。有人可能会说,你应该使用while(true),因为for(;;)可能会混淆初学者,但这更多的是风格问题。