【发布时间】:2015-01-20 01:59:54
【问题描述】:
基本上,我有大量对象的一些数据结构,这个结构将被多个线程访问,需要考虑到这一点。
需要不断地执行大量迭代和对象操作(每次主循环迭代都可能导致数据结构中的每个对象在最坏的情况下都被修改,而在最佳/正常情况下没有任何修改)。
目前,我使用CopyOnWriteArrayList 作为我的结构。此外,在每次迭代中,我确保不添加重复项,以尽量减小列表的大小。
使用锁/同步并不理想,因为我想避免为这些操作阻塞线程。
据我所知,我的选择如下:
- 运行
contains()检查每个要添加的元素 - 从列表中创建一个
HashSet并将其转换回来(基本上删除所有重复项) - 使用
ConcurrentHashMap代替数据结构的列表 - 还有别的吗?
我知道ArrayLists 的迭代效果要好得多,而严格使用HashMap 可以更好地处理对象操作和重复检查。由于我的情况需要两者,我想知道这里最好的解决方案是什么。
我还应该提到元素的顺序不是问题。
编辑:为了进一步澄清这一点,该集合将不断添加、删除和修改元素。在何种程度上取决于每个特定的运行时间(基于一般随机事件),所以我对做出任何关于它发生频率的假设持谨慎态度。唯一可以保证发生的事情是每次都会对集合进行完全迭代,对每个元素执行多次检查。
【问题讨论】:
-
如果您还需要快速唯一性检查,则 HashMap 上的迭代并不是特别糟糕。我会说整个集合的 ConcurrentHashMap。
-
如果您只需要一个集合,您也可以使用
Collections.newSetFromMap(new ConcurrentHashMap<>());- 我不确定迭代在地图与列表上是否会更糟,这是值得检查的。 -
我在 STO 上看到了其他几个线程,关于迭代 ArrayList 的平均速度是迭代 HashMap 键集的 3 或 4 倍
标签: java multithreading arraylist hashmap copyonwritearraylist