0

我有一个 ArrayList 的套接字,并且我正在使用多个线程。我是否需要将列表声明为 Collections.synchronizedList ,然后每次要迭代列表时调用 synchronized(listName) ?使用 listName.add(socket) 将新套接字添加到列表中怎么样?我还需要同步该呼叫吗?

服务器类

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Server implements Runnable {

    private int listenPort;
    private int maxClients;
    private int clientNumber;
    private boolean isRunning;
    private ServerSocket listener;

    // Synchronize This?
    private ArrayList<Client> clients;

    public Server(int listenPort, int maxClients) throws IOException {
        this.listenPort = listenPort;
        this.maxClients = maxClients;
        this.clientNumber = 0;
        this.isRunning = true;

        this.listener = new ServerSocket(
                listenPort, maxClients,
                InetAddress.getLocalHost()
        );

        this.clients = new ArrayList<Client>();
    }

    @Override
    public void run() {
        while (isRunning) {
            try {
                Socket socket = listener.accept();
                Client client = new Client(socket, ++clientNumber);
                clients.add(client);

                new Thread(client).start();
            } catch (IOException ex) {}
        }
    }
}
4

2 回答 2

2

是的。

您有多个线程的事实表明了这一点。

它包含的事实与它Sockets无关。

于 2013-05-27T04:47:10.443 回答
0

尽管在一般情况下,您应该同步对可以从不同线程访问的字段的访问,但这不一定在您的特定情况下,因为您实际上仅从一个线程访问此集合。但是,如果您打算继续开发并从其他线程访问此集合,@EJP 显然是正确的。

顺便说一句,至少在这个代码片段中你根本不需要这个集合。您正在为每个客户端打开线程。在套接字打开之前,线程将处于活动状态。为什么需要这个系列?

于 2013-05-27T05:06:22.007 回答