那么,最有可能你忘了初始化:
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'变量? –