Vai*_*pta 40 java concurrency multithreading blockingqueue
当喜欢LinkedBlockingQueue过ArrayBlockingQueue?
其数据结构中使用LinkedBlockingQueue和ArrayBlockingQueue时:
虽然有类似的问题,但它没有强调哪个应该是首选的事实?
链接:
Dim*_*rov 54
鲍里斯蜘蛛已经概述了最明显的区别ArrayBlockingQueue和LinkedBlockingQueue- 前者总是有界,而后者可以是无界的.
所以,如果你需要一个无界阻塞队列,LinkedBlockingQueue或LinkedTransferQueue用作BlockingQueue来自你最好的赌注java.util.concurrent工具箱.
但是,假设你需要一个有界的阻塞队列.最后,您应该选择基于广泛试验的实现,模拟您的实际工作负载.不过,这里有一些注释可以帮助您选择或解释实验结果:
ArrayBlockingQueue可以使用可配置(开/关)调度公平策略创建.如果你需要公平或者想要避免生产者/消费者的饥饿,这是很好的,但它会花费你的吞吐量.ArrayBlockingQueue 预分配其后备阵列,因此它在使用期间不会分配节点,但它会立即占用相当大的内存块,如果内存碎片化,这可能会成为一个问题.ArrayBlockingQueue 应该具有较少的性能可变性,因为它总体上具有较少的移动部件,它使用更简单且不太复杂的单锁算法,它在使用期间不创建节点,并且其缓存行为应该相当一致.LinkedBlockingQueue 应该有更好的吞吐量,因为它使用单独的头部和尾部锁.LinkedBlockingQueue 不预先分配节点,这意味着它的内存占用量将大致与其大小相匹配,但这也意味着它将产生一些分配和释放节点的工作.LinkedBlockingQueue 可能会有更糟糕的缓存行为,这可能会影响其自身的性能,但也会由于错误共享而影响其他组件的性能.根据您的使用情况以及您对性能的关注程度,您可能还需要java.util.concurrent考虑Disruptor(一种特别快速但有点专业的有界无阻塞环缓冲区)或JCTools(各种有界或无界)根据生产者和消费者的数量,具有不同保证的队列).
Bor*_*der 12
来自JavaDoc forArrayBlockingQueue
甲界由数组支持阻塞队列.
强调我的
基于链接节点的可选绑定阻塞队列.
强调我的
因此,如果您需要一个有界队列,您可以使用任何一个,如果您需要一个无限制的队列,您必须使用LinkedBlockingQueue.
对于有界队列,那么您需要进行基准测试以确定哪个更好.
| 归档时间: |
|
| 查看次数: |
15999 次 |
| 最近记录: |