2012-01-06 158 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(;;)可能會混淆初學者,但這更多的是風格問題。