0

我正在开发一个客户端 - 服务器应用程序,我有以下问题。

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

对于每个客户端,我调用方法 getClientsArray() 并获取该 ArrayList。问题是 ArrayList 在这里是空的,在 Client 类中。每次在 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!!    
            }
    }
4

2 回答 2

2

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

如果多个线程在没有适当同步的情况下访问同一个可变状态变量,那么您的程序就会损坏

您有clients可变状态,并且您不使用任何同步访问它的方法。

于 2013-05-07T01:10:53.690 回答
0

静态变量仅对一个程序实例是全局的。在这里,您至少有两个程序正在运行;您有一个服务器程序,以及至少一个其他客户端程序。客户端和服务器不共享任何公共堆或程序变量,因此静态列表只能由该程序看到。

如果要共享列表,则需要通过套接字或其他一些数据传输来传递它。这个问题,How to transfer objects over network using java,有一个如何通过套接字传递对象的代码示例。

于 2013-05-07T01:16:57.637 回答