我的要求是:我希望在多线程环境中执行频繁的操作,在多线程环境中对数百万的对象执行并发性和可伸缩性,同时要记住,我需要适合这个需求的最佳数据结构。
例如:
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适合这种类型的需求(并发性、可伸缩性、数百万对象、更好的频繁操作性能)。
提前谢谢!
发布于 2014-09-15 14:27:25
ConcurrentLinkedQueue没有等待(即没有锁,线程也不会挨饿),也不会执行任何复制。
如果您想要维护一个集合而不是一个列表,那么您可以让多个线程将对象添加到ConcurrentLinkedQueue中,并让一个单线程轮询队列并将这些对象添加到一个不同步的HashMap中;这可能比使用一个ConcurrentHashMap.更有效。但是,这假设您可以承受添加对象与显示在集合中的对象之间的轻微延迟。
发布于 2014-09-14 10:04:08
我认为性能最好的数据结构是一个hashMap,它有一个O(1)搜索操作,而一个arrayList需要一个O(N)。
在并发方面,我可能会使用
或
取决于你的需要。
我将在这里更详细地介绍两者之间的区别:复制地图的线程安全方法
https://stackoverflow.com/questions/25832079
复制相似问题