Java 多线程:将对象添加到 List/Queue/Set 的廉价操作
Java Multithreading: cheap operation to add object to List/Queue/Set
所以基本上我需要一种方法来将对象(我们称之为元素)添加到 List/Queue/Set 或类似的多线程对象。因为我需要添加很多元素(不确定有多少但相信我很多),操作应该很便宜。删除它们是没有必要的。此外,将每个元素添加到列表中也非常重要。
基本上我在找这个:
- 线程安全
- 廉价添加功能
- 未comparable/not排序
- 每个元素都需要添加
因为 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
的基础上实现的,它做了很多事情以获得稳定的性能。
所以基本上我需要一种方法来将对象(我们称之为元素)添加到 List/Queue/Set 或类似的多线程对象。因为我需要添加很多元素(不确定有多少但相信我很多),操作应该很便宜。删除它们是没有必要的。此外,将每个元素添加到列表中也非常重要。
基本上我在找这个:
- 线程安全
- 廉价添加功能
- 未comparable/not排序
- 每个元素都需要添加
因为 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
的基础上实现的,它做了很多事情以获得稳定的性能。