首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在不获取ConcurrentModificationException的情况下,通过线程将对象添加到列表中,同时使用列表?

在不获取ConcurrentModificationException的情况下,通过线程将对象添加到列表中,同时使用列表,可以使用线程安全的数据结构来解决该问题。以下是一种可能的解决方案:

  1. 使用CopyOnWriteArrayList类:CopyOnWriteArrayList是Java提供的线程安全的ArrayList实现。它通过在修改操作时创建一个新的副本来实现线程安全。这样,即使在迭代列表时进行修改,也不会抛出ConcurrentModificationException异常。

示例代码如下:

代码语言:txt
复制
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class ThreadSafeListExample {
    private List<Object> list = new CopyOnWriteArrayList<>();

    public void addObject(Object obj) {
        list.add(obj);
    }

    public void printList() {
        for (Object obj : list) {
            System.out.println(obj);
        }
    }
}

在上面的示例中,我们使用CopyOnWriteArrayList来存储对象,并且在添加对象时不会抛出ConcurrentModificationException异常。可以通过调用addObject方法来添加对象,并通过调用printList方法来打印列表中的对象。

  1. 使用同步块:另一种解决方案是使用同步块来确保在修改列表时不会发生并发修改异常。通过在修改列表的代码块中使用synchronized关键字,可以确保同一时间只有一个线程可以修改列表。

示例代码如下:

代码语言:txt
复制
import java.util.ArrayList;
import java.util.List;

public class ThreadSafeListExample {
    private List<Object> list = new ArrayList<>();

    public void addObject(Object obj) {
        synchronized (list) {
            list.add(obj);
        }
    }

    public void printList() {
        synchronized (list) {
            for (Object obj : list) {
                System.out.println(obj);
            }
        }
    }
}

在上面的示例中,我们使用ArrayList来存储对象,并通过使用同步块来确保在修改列表时不会发生并发修改异常。可以通过调用addObject方法来添加对象,并通过调用printList方法来打印列表中的对象。

无论使用哪种方法,都可以在不获取ConcurrentModificationException的情况下,通过线程将对象添加到列表中,并且可以同时使用列表。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

看了CopyOnWriteArrayList后自己实现了一个CopyOnWriteHashMap

面试官: 小伙子你有点眼熟啊,是不是去年来这面试过啊。 二胖: 啊,没有啊我这是第一次来这。 面试官: 行,那我们开始今天的面试吧,刚开始我们先来点简单的吧,java里面的容器你知道哪些啊,跟我说一说吧。 二胖: 好的,java里面常见容器有ArrayList(线程非安全)、HashMap(线程非安全)、HashSet(线程非安全),ConcurrentHashMap(线程安全)。 面试官: ArrayList 既然线程非安全那有没有线程安全的ArrayList列? 二胖: 这个。。。好像问到知识盲点了。 面试官: 那我们今天的面试就先到这了,我待会还有一个会,后续如有通知人事会联系你的。 以上故事纯属虚构如有雷同请以本文为主。

01
领券