java - 替代 CopyOnWriteArrayList 用于频繁写入,偶尔迭代

标签 java concurrency arraylist

我有一个 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/

相关文章:

java - 包含列表的 gwt RequestFactory 映射

c# - 交换对象和线程安全性有任何问题吗?

java - Java 1.4.2 中的 ArrayList 到 Array

java - 在java中压缩整数数组

java - Exceptions 与 throws 子句不兼容的原因是什么?

java - 同步部分不阻塞!

java - 为什么使用不同的 ArrayList 构造函数会导致内部数组的增长率不同?

mysql - ArrayList 数据库 MySQL

java - 当基类有带参数的构造函数时,为什么我不能创建无参数的子类构造函数?

concurrency - 什么时候可以在不锁定的情况下安全地访问受互斥锁保护的变量?