在线程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/