我有一个套接字的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) {}
}
}
}
答案 0 :(得分:2)
是
你有多个线程的事实决定了这一点。
它包含Sockets
的事实与它无关。
答案 1 :(得分:0)
虽然在一般情况下,您应该同步访问可以从不同线程访问的字段,但这不一定在您的特定情况下,因为您实际上只从一个线程访问此集合。但是,如果您计划继续开发并从其他线程访问此集合,@ EJP显然是正确的。
至少在这个代码片段中你根本不需要这个集合。您是每个客户端打开线程。在socket打开之前,线程将处于活动状态。你为什么需要这个系列?