好吧,很可能你忘了初始化它:
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;
}
}