我有一个 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
请帮我找到最好的方法。
最佳答案
您可以尝试使用 Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());
这将为您提供一个并发哈希集,这将使您接近 O(1) 添加和删除。
关于java - 替代 CopyOnWriteArrayList 用于频繁写入,偶尔迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6074111/