java - 运行两个线程时出现 ConcurrentModificationException 问题

标签 java multithreading arraylist concurrency network-programming

所以,我目前正在一个支持多客户端的服务器上工作,我有一个线程检查是否有任何套接字连接到给定端口,然后将它们添加到另一个线程用来更新我的所有内容的数组列表需要处理客户端(更新信息、检查 DataInputStream、通过服务器发送文本)等。

客户端代码:

public class Loop implements Runnable{

ArrayList<ClientInstance> clientsConnected = new ArrayList<ClientInstance>();

@Override
public void run() {
    while(true) {
        checkInputStream();
    }

}

public void checkInputStream() {
    for (ClientInstance s : clientsConnected) {
        s.checkInputStream();
    }
}

服务器代码:

public synchronized void waitForClient() {
    try {
        System.out.println("Waiting for client on port: "
                + serverSocket.getLocalPort());
        Socket client = serverSocket.accept();
        System.out.println("Client Connected! " + client.getInetAddress());
        loop.getClientsConnected().add(new ClientInstance(client));
        System.out.println("Client added to clients connected! ");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

但是当我运行服务器然后将一个客户端连接到它时它工作正常,但是当我连接另一个客户端时它给了我这个问题:

Exception in thread "Thread-1" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)

我该怎么办?

最佳答案

这是因为您正在修改数组列表(即在 waitForClient() 方法中的列表中添加元素),同时您在 checkInputStream() 方法中对其进行迭代.

如@Arjit 所述,使用 CopyOnWriteArrayList而不是 ArrayList

关于java - 运行两个线程时出现 ConcurrentModificationException 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30634872/

相关文章:

java - 新文件未在 renameTo() 上被调用

c - 声明临时结构作为参数传递——结构被重写。如何在新的内存位置声明该结构?

带有线程池的Java阶乘计算

java - 无法打破经典的延迟初始化单例

java - Java中如何从ArrayList中获取float[]

java - ArrayList remove() 的特殊行为 - 为什么?

java - 使用 Collection 对 ArrayList 进行排序的问题

java - 将 Oracle 存储过程结果映射到自定义 Java 类型(类)

java - 在 Java Web 应用程序(JAX RS,Jersey)中提交表单时将 ArrayList 传递到 Response 类方法

java - 在 hadoop 中运行作业 - 错误