Ily*_*gin 4 java concurrency multithreading
在线程 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);
}
Run Code Online (Sandbox Code Playgroud)
Q1:这是否满足要求?
问题 2:如何在不Collections.unmodifiableList使用可复制的迭代器和 try-catch 块的情况下做同样的事情?
更新。这是我一年前被问到的一个面试问题。我理解在多线程环境中使用非线程安全集合(如 ArrayList)是一个坏主意
号ArrayList不是线程安全的,并没有使用明确的synchronization。
当您执行 unmodifiableList 方法时,第一个线程可以修改原始列表,您将拥有一个无效的不可修改列表。
我认为最简单的方法如下:
例如,类似于:
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3293 次 |
| 最近记录: |