Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多线程环境中,使用哪种数据结构存储数百万个对象(可伸缩性和性能)?_Java_Multithreading_Concurrency_Scalability - Fatal编程技术网

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

Java 在多线程环境中,使用哪种数据结构存储数百万个对象(可伸缩性和性能)?,java,multithreading,concurrency,scalability,Java,Multithreading,Concurrency,Scalability,我的要求是:我想在多线程环境中对数百万个对象执行频繁的操作,具有并发性和可伸缩性记住,我需要适合此要求的最佳数据结构 例如: public interface CarDetails { public CopyOnWriteArrayList<Car> getAllCars(); public Car getMostSoldCars(int carModel); public void addNewCarDetails(Car car); public void

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

例如:

public interface CarDetails {
   public CopyOnWriteArrayList<Car> getAllCars();
   public Car getMostSoldCars(int carModel);
   public void addNewCarDetails(Car car);
   public void oldCardDetails(Car car);
}     
公共接口卡详情{
公共CopyOnWriteArrayList getAllCars();
公共汽车(国际汽车模型);
公共无效添加新卡详情(汽车);
公共无效旧卡详细信息(汽车);
}     
最初,我想使用并发API(CopyOnWriteArrayList),因为它比外部同步列表(例如:Collections.synchronizedList(List对象)
)性能更好

CopyOnWriteArrayList的问题:在内存中存储数百万个对象并对其执行最频繁的操作会对性能产生影响,因为CopyOnWriteArrayList在每次更新时都会创建全新的列表,并且对数百万个对象执行此类操作会导致性能问题。这对于多个阅读器来说是很好的,但我希望在大量对象上获得性能

集合问题。synchronizedList(列表对象):外部同步列表还有另一个问题,因为它锁定了整个对象,而该对象又有另一个性能问题

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


提前感谢

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

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

根据你的需要

我将在这里详细介绍这两者之间的区别: 无需等待(即无锁且线程不会饿死),并且不执行任何复制


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

您可能不需要比
synchronizedList
包装器更好的东西。您是否实际测试了该解决方案的性能?此外,选择绝对最优的结构涉及到比您提供的更多的细节,例如:更新频率、读写比、实际并发级别等等。建议查看
concurrentHashMap
()``test,test,test。尝试所有方法和基准。正如@MarkoTopolnik所说,从最简单的解决方案开始,逐步改进——用基准检查每一个“改进”。如果
synchronizedList
不够好,请编写一个
实现List
的类,并用
ReentrantReadWriteLock
包装一个
ArrayList
。非常感谢!!,我将尝试实现(concurrenthashmap和Reentrantreadwritelock),并比较哪一个最适合我的需求。列表不是集合。虽然
Set
具有
O(1)
搜索功能,但它也会维护唯一的对象,这会产生成本。密钥在一个集合中,它不会维护它,这与搜索相同,如果存在,它会覆盖,它不会进行检查。在不进行任何检查的情况下,它如何知道
如果存在,它会覆盖?散列和检查需要时间。O(1)并不一定意味着一个操作需要一步。这意味着操作需要恒定的时间。尽管有数百万条记录,但一些“bucket”可能包含多条记录,这意味着HashMap将花费略多于O(1)的时间。