Java 我需要同步套接字的ArrayList吗?

Java 我需要同步套接字的ArrayList吗?,java,sockets,tcp,synchronization,Java,Sockets,Tcp,Synchronization,我有一个套接字数组列表,我使用多个线程。我是否需要将列表声明为Collections.synchronizedList,然后在每次迭代列表时调用synchronized(listName)?使用listName.add(socket)将新套接字添加到列表中怎么样?我是否也需要同步该呼叫 服务器类 import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.ne

我有一个套接字数组列表,我使用多个线程。我是否需要将列表声明为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) {}
        }
    }
}
import java.io.IOException;
导入java.net.InetAddress;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.util.ArrayList;
公共类服务器实现可运行{
私人int listenPort;
私人客户;
私人int客户号;
私有布尔运算;
私有服务器套接字侦听器;
//同步这个?
私人ArrayList客户;
公共服务器(int-listenPort,int-maxClients)引发IOException{
this.listenPort=listenPort;
this.maxClients=maxClients;
this.clientNumber=0;
this.isRunning=true;
this.listener=newserversocket(
listenPort、MaxClient、,
InetAddress.getLocalHost()
);
this.clients=new ArrayList();
}
@凌驾
公开募捐{
同时(正在运行){
试一试{
Socket=listener.accept();
客户端=新客户端(socket,++clientNumber);
客户。添加(客户);
新线程(client.start();
}catch(IOException ex){}
}
}
}

有多个线程的事实说明了这一点


它包含
套接字的事实与此无关。

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

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