CopyOnWriteArrayList 的替代方法,用于频繁写入、偶尔迭代

2022-09-04 03:25:01

我有一个要无限期地缓存和共享在多个线程之间。操作包括频繁的添加和删除,以及偶尔迭代它。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

请帮我找到最好的方法。


答案 1

你可以尝试使用一个 This 会给你一个并发哈希集,它会给你接近 O(1) 添加和删除。Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());


答案 2

一种可能性是使用 ConcurrentLinkedQueue,如果您可以使用 Queue 接口而不是 List。我认为,比您预期的更多的用例可能会对队列感到满意。List 的一个关键优点是随机访问(基于索引),但在并发情况下,随机访问既不必要也不可取。

ConcurrentLinkedQueue 是 Queue 的一个出色的并发实现。


推荐