Java 多线程:将对象添加到 List/Queue/Set 的廉价操作

Java Multithreading: cheap operation to add object to List/Queue/Set

所以基本上我需要一种方法来将对象(我们称之为元素)添加到 List/Queue/Set 或类似的多线程对象。因为我需要添加很多元素(不确定有多少但相信我很多),操作应该很便宜。删除它们是没有必要的。此外,将每个元素添加到列表中也非常重要。

基本上我在找这个:

因为 CopyOnWriteArrayList 对我来说听起来很贵,我不认为这是一个选择。

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

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

目前我正在考虑使用 ConcurrentLinkedQueue 或者像这样同步添加方法:

private synchronized void add(Element elem){
    elements.add(elem);
}

一般来说,您应该坚持使用 JDK 库中的方法和 类;它们往往是相当优化的,并且会在未来的版本中走下坡路,这将导致您的代码无需您的努力就可以更新。事实上,这是 Joshua Bloch 的 Effective Java.

中的一项

注意这条规则,因为你似乎并不真正关心你真正得到什么样的 collection ("List/Queue/Set “在你的问题中),你为什么不直接做

Collection<YourData> synced = Collections.synchronizedCollection(new LinkedList<>());

LinkedList 优化添加元素(与 ArrayList 相反,后者将在容量耗尽时复制底层数组),而 synchronizedCollection 将进行 synchronized 包装(如果您查看代码,它会完全按照您的建议实现)。 synchronizedList 顺便说一句也是如此。

我认为您可以基于 guava 中的 ConcurrentHashMultiset 实现一个集合。

ConcurrentHashMultiset是在ConcurrentHashMap的基础上实现的,它做了很多事情以获得稳定的性能。