【发布时间】:2013-06-08 08:26:46
【问题描述】:
我认为,在大多数情况下,ArrayBlockingQueue 的性能将优于LinkedBlockingQueue。但是,当数组中总是有足够的空间时就是这种情况……如果它已满,那么它是否会表现得这么好就不是很可预测了,因为它会阻塞试图将数据推送到队列中的线程。 .
所以,我的问题是:BlockingQueue 是否有任何中间实现?比如,ArrayListBlockingQueue 或 BucketListBlockingQueue?类似于数组列表的东西,这样队列可以动态增加容量,同时仍然可以从使用数组最终存储数据中获得合理的好处?
【问题讨论】:
-
数组列表不会提高性能...为什么会这样?此外:您为什么担心性能?你真的有问题吗?你有简介吗?
-
我在考虑内存局部性。如果您使用其元素在随机内存地址周围跳转的链表,则更有可能出现缓存未命中和类似问题。另外,要从内存中获取,您必须获取下一个元素的地址,然后获取该地址的内容......而对于数组,您只需执行 address++ 即可获取下一个元素的地址。使用数组列表,您会在两种实现之间做出一些妥协……您认为不是吗?
-
我认为数组列表给你带来的好处都不是原始集合。您仍然必须分配内存,并且根据数组的大小,它会或多或少地碎片化。我认为,如果您使基于数组的集合大小调整算法正确,您将几乎没有调整大小和非常快速的迭代。至于内存局部性 - 集合存储对对象的引用,这些对象本身可能位于内存中的任何位置,因此在这方面您可能不会从使用一个集合或其他集合中获得任何收益。
标签: java multithreading synchronization queue