java - 如何在java多线程环境中复制ArrayList<T>?

标签 java multithreading concurrency

在线程A中,创建了一个ArrayList。它仅由线程 A 管理。 在线程 B 中,我想将其复制到一个新实例。

要求是 copyList 不应失败,并且应返回列表的一致版本(= 至少在复制过程中的某个时间存在)。

我的方法是这样的:

public static <T> ArrayList<T> copyList(ArrayList<? extends T> list) {
    List<? extends T> unmodifiableList = Collections.unmodifiableList(list);
    return new ArrayList<T>(unmodifiableList);
}

Q1:是否满足要求?

问题 2:如果没有 Collections.unmodifyingList 以及可能的迭代器和 try-catch block ,我怎样才能做到同样的事情?

UPD。这是我一年前被问到的一个面试问题。我知道在多线程环境中使用像 ArrayList 这样的非线程安全集合是一个坏主意

最佳答案

没有。 ArrayList 不是线程安全的,并且您没有使用显式同步

当您执行 unmodifyingList 方法时,第一个线程可以修改原始列表,并且您将得到一个无效的不可修改列表。

我认为最简单的方法如下:

  • 将列表替换为其同步版本。
  • 在复制列表上同步arrayList并进行复制

例如,类似:

List<T> l = Collections.synchronizedList(new ArrayList<T>());

...

public static <T> List<T> copyList(List<? extends T> list) {
    List<T> copyList = null;
    synchronized(list) {
        copyList = new ArrayList<T>(list);
    }
    return copyList;
}

关于java - 如何在java多线程环境中复制ArrayList<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37793591/

相关文章:

java - 结合Spring项目和Jersey

java - Spring Data Rest 能否提供足够的灵活性以用于现实世界的应用程序?

java - 如何防止 Html.fromHtml 修剪空格

multithreading - 为什么我的事件监视器显示 Node.js 使用多线程?

Java原子操作

go - 为什么我在通过 channel 接收值时看不到输出

java - 我的 ExpirableLazyObject 不是线程安全的吗?有竞争条件吗?

java - ThreadPool 中任务的自定义顺序

java - 如何知道所需的核心数和内存数?

c++ - 加入线程时出现异常