首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多线程环境中使用哪种数据结构来存储数百万对象(可伸缩性和性能)?

在多线程环境中使用哪种数据结构来存储数百万对象(可伸缩性和性能)?
EN

Stack Overflow用户
提问于 2014-09-14 09:56:52
回答 2查看 2.1K关注 0票数 2

我的要求是:我希望在多线程环境中执行频繁的操作,在多线程环境中对数百万的对象执行并发性和可伸缩性,同时要记住,我需要适合这个需求的最佳数据结构。

例如:

代码语言:javascript
复制
public interface CarDetails {
   public CopyOnWriteArrayList<Car> getAllCars();
   public Car getMostSoldCars(int carModel);
   public void addNewCarDetails(Car car);
   public void oldCardDetails(Car car);
}     

最初,我曾想过使用并发API's(CopyOnWriteArrayList)作为它的性能比外部同步列表(:Collections.synchronizedList(列表对象))更好。

问题与CopyOnWriteArrayList有关:在内存中存储数百万个对象并对其执行最频繁的操作会对性能产生影响,因为每当发生任何更新时,CopyOnWriteArrayList都会创建全新的列表,而对数百万对象执行此类操作会导致性能问题。它对多个读者是好的,但我正在寻找大量对象的性能。

Collections.synchronizedList问题(列表对象):外部同步列表的还有另一个问题,因为它锁定了整个对象,这有另一个性能问题。

谁能建议我,哪一个集合API适合这种类型的需求(并发性、可伸缩性、数百万对象、更好的频繁操作性能)。

提前谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-15 14:27:25

ConcurrentLinkedQueue没有等待(即没有锁,线程也不会挨饿),也不会执行任何复制。

如果您想要维护一个集合而不是一个列表,那么您可以让多个线程将对象添加到ConcurrentLinkedQueue中,并让一个单线程轮询队列并将这些对象添加到一个不同步的HashMap中;这可能比使用一个ConcurrentHashMap.更有效。但是,这假设您可以承受添加对象与显示在集合中的对象之间的轻微延迟。

票数 0
EN

Stack Overflow用户

发布于 2014-09-14 10:04:08

我认为性能最好的数据结构是一个hashMap,它有一个O(1)搜索操作,而一个arrayList需要一个O(N)。

在并发方面,我可能会使用

ConcurrentSkipListMap

ConcurrentHashMap

取决于你的需要。

我将在这里更详细地介绍两者之间的区别:复制地图的线程安全方法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25832079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档