我有主线程和ClientThread ...
在主线程中,当用户连接到服务器时,它将在ClientThread中调用方法

    try {
        Socket socket = server.accept();
        clientThread.addClient(socket);
    } catch(Exception e) {
        e.printStackTrace();
    }


ClientThread中的方法将内容添加到ArrayList

public void addClient(Socket socket) {
    clientSockets.add(socket);
}


ClientThread还在每个帧上运行以下代码:

        for (Socket socket : clientSockets) {
            label.setText(socket.toString());
        }


由于某种原因,我在此行java.util.ConcurrentModificationException上得到了这个错误for (Socket socket : clientSockets) { ...

问题:为什么会出现此错误,我该如何解决?

最佳答案

您需要同步对clientSockets的访问,因为在迭代过程中不允许更改List的结构。

一个简单的解决方案是使clientSockets成为同步的集合,然后在迭代之前对其进行显式同步:

List<Socket> clientSockets = Collections.synchronizedList(new ArrayList<Socket>());


//...when setting the labels:
synchronized (clientSockets) {
    for ( Socket socket : clientSockets ) {
        label.setText(socket.toString());
    }
}


无论何时遍历列表,都需要执行相同的操作。

您还可以考虑使用CopyOnArrayList之类的东西,它不需要您进行同步,但要消耗更多的内存并可能提供稍微陈旧的数据。

08-27 12:18