那麼,最有可能你忘了初始化:
private final AtomicInteger highestBid = new AtomicInteger();
然而,隨着highestBid
工作需要知識的大量工作得到它的權利,沒有任何鎖定。例如,如果你想與新的最高報價來更新它:
public boolean saveIfHighest(int bid) {
int currentBid = highestBid.get();
while (currentBid < bid) {
if (highestBid.compareAndSet(currentBid, bid)) {
return true;
}
currentBid = highestBid.get();
}
return false;
}
或在更緊湊的方式:
for(int currentBid = highestBid.get(); currentBid < bid; currentBid = highestBid.get()) {
if (highestBid.compareAndSet(currentBid, bid)) {
return true;
}
}
return false;
你可能會問,爲什麼這麼難?圖像兩個線程(請求)同時出現。目前最高報價是10.一個是11,另一個12。兩個線程比較當前highestBid
並意識到他們更大。現在第二個線程恰好是第一個,並將其更新爲12.不幸的是,第一個請求現在進入並將其恢復爲11(因爲它已經檢查了條件)。
這是一種典型的競態條件,您可以通過顯式同步或通過使用具有隱式比較和設置底層支持的原子變量來避免這種情況。
眼見通過更高性能的無鎖的原子整數帶來的複雜性你可能要恢復到經典同步:
public synchronized boolean saveIfHighest(int bid) {
if (highestBid < bid) {
highestBid = bid;
return true;
} else {
return false;
}
}
如果沒有看到你的代碼,我們真的不知道什麼是錯的。你是否曾經初始化你的'atomicVariable'變量? –