java - 静态ArrayList不会在另一个类中修改

标签 java

我正在开发客户端-服务器应用程序,但遇到以下问题。

在一个类(服务器)中,我有一个对名为 client 的 ArrayList 的静态引用和一个静态 getter getClientsArray()。在另一个类(ServerThread)中,我使用相同的ArrayList并成功修改它(添加/删除客户端)。

对于每个客户端,我调用方法 getClientsArray() 并获取该 ArrayList。问题是 Client 类中的 ArrayList 在这里是空的。每次在 ServerThread 中更新它时(客户端连接后)我都会检查它,里面应该有一些东西。

    public class Server {
            private static ArrayList<User> clients = new ArrayList<User>();

            public static ArrayList<User> getClientsArray() {
                  return clients;
            }

            and somewhere I call: new ServerThread(sock, users).start();
    }

    public class ServerThread extends Thread {
        private ArrayList<User> users;

        public ServerThread(Socket client, ArrayList<User> users) {
                this.client = client;
                this.users = users;
        }
        if I modify users in this class, the changes will occur
    }

    public class Client extends JFrame {
        private ArrayList<User> users;
            public Client() {
                initGraphics();

                users = Server.getClientsArray();
                System.out.println(users.size()); <- This line always writes 0!!    
            }
    }

最佳答案

Brian Goetz 在JCIP 中定义了一条简单的规则。 :

If multiple threads access the same mutable state variable without appropriate synchronization, your program is broken.

您拥有客户端可变状态,并且您没有使用任何同步对其访问的方法。

关于java - 静态ArrayList不会在另一个类中修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16408662/

相关文章:

Apache Pivot 网站上的此浏览器不支持 Java 插件

java - 错误显示我的 sqlite 数据库表中不存在特定列

java - 代码的不同迭代之间没有更新(康威的生命游戏)

java - ($Proxy6) org.postgresql.jdbc4.Jdbc4Connection@5894585b,这是什么意思?

java - XML 包装器 JSON 格式问题

Java 条件语句(if 子句设置)

java - 我可以在没有 Bouncy CaSTLe 的情况下使用 PKCS#7 加密、解密、签名或验证数据吗?

java - 多键映射 - 性能比较

java - 其他gradle任务未出现

java - Google App Engine (Java) 中的 RSS 解析器