所以我用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