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



我的要求是:我想在多线程环境中对数百万对象执行频繁操作,并具有并发性和可扩展性请记住,我需要适合此要求的最佳数据结构。

例如:

public interface CarDetails {
   public CopyOnWriteArrayList<Car> getAllCars();
   public Car getMostSoldCars(int carModel);
   public void addNewCarDetails(Car car);
   public void oldCardDetails(Car car);
}     

最初,我曾考虑使用并发的API(CopyOnWriteArrayList),因为与外部同步列表(例如:Collections.synchronizedList(列表对象))相比,它的性能更好。

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

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

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

提前感谢!!!

ConcurrentLinkedQueue没有等待(即没有锁,线程不会饿死),并且不执行任何复制

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

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

在并发方面,我可能会选择

并发跳过列表映射

并发哈希映射

根据您的需要。

我在这里详细介绍两者之间的区别:复制映射的线程安全方式

最新更新