作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开展一个项目,以创建一个可连接多个客户端的简单拍卖服务器。服务器类实现 Runnable,因此为每个连接的客户端创建一个新线程。我试图将当前最高出价存储在每个客户都可以看到的变量中。我找到了使用 AtomicInteger 的答案,但是当我将它与 atomicVariable.intValue() 等方法一起使用时,我遇到了空指针异常错误。
我可以通过哪些方式操作 AtomicInteger 而不会出现此错误,或者是否有其他方式可以拥有相对简单的共享变量?
如有任何帮助,我们将不胜感激。
更新
我有 AtomicInteger 工作。现在的问题是,似乎只有最近连接到服务器的客户端才能与之交互。另一个客户端有点僵硬。
我说这是锁定问题是否正确?
最佳答案
嗯,很可能你忘了初始化它:
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;
}
}
关于Java Server Client,线程间共享变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13517841/
我是一名优秀的程序员,十分优秀!