2013-05-27 2 views
0

У меня есть ArrayList сокетов, и я использую несколько потоков. Нужно ли объявлять список как Collections.synchronizedList, а затем вызывать синхронизацию (listName) каждый раз, когда я хочу перебирать список? Как добавить новые сокеты в список с listName.add (сокет)? Нужно ли мне синхронизировать этот вызов?Нужно ли мне синхронизировать ArrayList сокетов?

Class Server

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) {} 
     } 
    } 
} 

ответ

2

Да.

Тот факт, что у вас несколько потоков, диктует это.

Тот факт, что он содержит Sockets, не имеет к этому никакого отношения.

0

Хотя в общем случае вы должны синхронизировать доступ к полям, к которым можно получить доступ из разных потоков, это не обязательно в вашем конкретном случае, потому что вы получаете доступ к этой коллекции фактически только из одного потока. Однако, если вы планируете продолжить разработку и получить доступ к этой коллекции из других потоков, @EJP, очевидно, прав.

BTW по крайней мере в этом фрагменте кода вам эта коллекция вовсе не нужна. Вы открываете поток для каждого клиента. Нить будет жива до открытия сокета. Зачем вам эта коллекция?

Смежные вопросы