Java Server Client,线程间共享变量

标签 java multithreading client

我正在开展一个项目,以创建一个可连接多个客户端的简单拍卖服务器。服务器类实现 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/

相关文章:

Java - 通过服务器/客户端架构托管文件

Java - 如何检索局域网上已知端口的服务器IP

java - 线程中出现异常 "AWT-EventQueue-0"java.lang.NullPointerException 错误,该怎么办?

java - LDAP查询获取一个组的所有组(嵌套)

java - hibernate > CLOB > Oracle :(

python - 在 Python 中调用 exit() 时,C++ 析构函数中的互斥锁会导致异常

java - wait/notify 和 Condition 如何管理线程

java - "identity-based Map"和 "topology-preserving object graph transformations"是什么意思?

mysql - 我是否正确计算了 MySQL 数据库的最大连接限制?

javascript - 有没有一种方法可以在不使用服务器端语言的情况下使用密码保护 HTML 页面?