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

时间:2014-09-14 09:56:53

标签: java multithreading concurrency scalability

我的要求是:我希望在多线程环境中对数百万对象执行频繁操作,并且并发性和可伸缩性保持在请注意,我需要最适合此要求的数据结构。

例如:

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

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

CopyOnWriteArrayList问题:要在内存中存储数百万个对象并对其执行frequest操作会对性能产生影响,因为每当发生任何更新并且在数百万个对象上执行此类操作时,CopyOnWriteArrayList都会创建全新的List有性能问题。它对多个读者有好处,但我正在寻找大量对象的性能。

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

有人可以建议我,哪种集合API适合这种类型的要求(并发性,可扩展性,数百万个对象,频繁操作时的更好性能)。

提前致谢!!!

2 个答案:

答案 0 :(得分:0)

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

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

ConcurrentSkipListMap

ConcurrentHashMap

视您的需要而定。

我在这里详细介绍了两者之间的区别: Thread safe way to copy a map

答案 1 :(得分:0)

ConcurrentLinkedQueue无等待(即无锁,线程不会挨饿)且无法执行任何复制

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