Java多线程:将对象添加到列表/队列/集合的廉价操作
因此,基本上我需要一种方法将对象(我们称之为元素)添加到列表/队列/集合或类似的多线程中。因为我需要添加很多元素(不知道有多少,但请相信我),所以操作应该很便宜。不需要移除它们。此外,将每个元素添加到列表中也非常重要 基本上我在找这个:Java多线程:将对象添加到列表/队列/集合的廉价操作,java,multithreading,thread-safety,add,java.util.concurrent,Java,Multithreading,Thread Safety,Add,Java.util.concurrent,因此,基本上我需要一种方法将对象(我们称之为元素)添加到列表/队列/集合或类似的多线程中。因为我需要添加很多元素(不知道有多少,但请相信我),所以操作应该很便宜。不需要移除它们。此外,将每个元素添加到列表中也非常重要 基本上我在找这个: 线程安全 廉价加法函数 不可比较/未排序 每个元素都需要添加 因为在我的情况下,CopyOnWriteArrayList听起来相当昂贵,所以我不认为这是一种选择 不幸的是,我无法使元素具有可比性,因此ConcurrentSkipListSet不是一个选项 C
- 线程安全
- 廉价加法函数
- 不可比较/未排序
- 每个元素都需要添加
private synchronized void add(Element elem){
elements.add(elem);
}
一般来说,您应该坚持使用JDK库中的方法和类;它们往往是相当优化的,并将在未来的版本中,这将导致您的代码被更新,而无需您的努力。事实上,这是Joshua Bloch的有效Java中的一项 注意这条规则,既然你似乎并不真正关心你真正得到的是什么样的集合(“在你的问题中,
列表
/队列
/设置
”),你为什么不这样做呢
Collection<YourData> synced = Collections.synchronizedCollection(new LinkedList<>());
Collection synced=Collections.synchronizedCollection(新LinkedList());
LinkedList
优化添加元素(与容量耗尽时复制底层数组的ArrayList
相反,synchronizedCollection
将执行synchronized
包装(如果查看代码,它的实现完全符合您的建议)。synchronizedList
btw.我认为您可以基于来自的ConcurrentHashMultiset
实现一个集合
ConcurrentHashMultiset
是基于ConcurrentHashMap
实现的,它做了很多事情来获得可靠的性能。您只需要独特的元素吗?您可以使用第三方库吗?您是否做过任何基准测试来比较ConcurrentLinkedQueue和CopyOnWriteArrayList?同意哇,选择实现时,“听起来像”并不是一个好的论据。你需要进行测量,尤其是因为这些情况在很多情况下表现不同,而且你没有真正深入细节。还有,为什么你认为你不能让一个元素具有可比性?您可以提供一个包装器类来扩展元素或包含元素,并实现可比较的。ConcurrentSkipListSet还有一个构造函数,它将比较器作为参数。还有ConcurrentHashMap。一般来说,这可能是一个选项,但我不想使用库。我不确定这是否会太贵。我只需要同步写入访问(add方法),而不需要同步读取。