Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Thread Safety_Add_Java.util.concurrent - Fatal编程技术网

Java多线程:将对象添加到列表/队列/集合的廉价操作

Java多线程:将对象添加到列表/队列/集合的廉价操作,java,multithreading,thread-safety,add,java.util.concurrent,Java,Multithreading,Thread Safety,Add,Java.util.concurrent,因此,基本上我需要一种方法将对象(我们称之为元素)添加到列表/队列/集合或类似的多线程中。因为我需要添加很多元素(不知道有多少,但请相信我),所以操作应该很便宜。不需要移除它们。此外,将每个元素添加到列表中也非常重要 基本上我在找这个: 线程安全 廉价加法函数 不可比较/未排序 每个元素都需要添加 因为在我的情况下,CopyOnWriteArrayList听起来相当昂贵,所以我不认为这是一种选择 不幸的是,我无法使元素具有可比性,因此ConcurrentSkipListSet不是一个选项 C

因此,基本上我需要一种方法将对象(我们称之为元素)添加到列表/队列/集合或类似的多线程中。因为我需要添加很多元素(不知道有多少,但请相信我),所以操作应该很便宜。不需要移除它们。此外,将每个元素添加到列表中也非常重要

基本上我在找这个:

  • 线程安全
  • 廉价加法函数
  • 不可比较/未排序
  • 每个元素都需要添加
因为在我的情况下,CopyOnWriteArrayList听起来相当昂贵,所以我不认为这是一种选择

不幸的是,我无法使元素具有可比性,因此ConcurrentSkipListSet不是一个选项

Collections.synchronizedList()听起来也太贵了

目前,我正在考虑使用一个ConcurrentLinkedQueue或像这样同步add方法:

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方法),而不需要同步读取。