我有一个ArrayList
,可以无限期地在多个线程中进行缓存和共享。操作包括频繁的添加和删除,以及偶尔迭代它。
ArrayList
位于一个包装类中,用于管理对它的访问:
public class MyListWrapper<T> implements Iterable<T> {
private List<T> innerList = new ArrayList<T>();
public Iterator<T> iterator() {
return innerList.listIterator();
}
public void add(T element) {
innerList.add(element);
//app-specific logic
}
//remove(T), etc in the same pattern...
}
我正在为线程安全做准备。起初,CopyOnWriteArrayList
似乎是最好的答案,但它的性能令我担忧,因为修改将比其他任何事情更频繁。
手动更改包装类是否会更好?
public Iterator<T> iterator() {
return new ArrayList<T>(innerList).listIterator();
}
//plus concurrency tweaks for any non-atomic modifications to innerList
请帮我找到最好的方法。
答案 0 :(得分:8)
您可以尝试使用Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());
这将为您提供并发哈希集,这将使您接近O(1)添加和删除。
答案 1 :(得分:5)
如果您可以使用Queue接口而不是List,则可以使用ConcurrentLinkedQueue。我认为,比你预期的更多用例可能会对队列感到满意。 List的一个关键优势是随机访问(基于索引),但在并发情况下,随机访问既不必要也不可取。
ConcurrentLinkedQueue是Queue的优秀并发实现。