当前位置: 首页 > 面试题库 >

什么时候更喜欢LinkedBlockingQueue而不是ArrayBlockingQueue?

公孙琛
2023-03-14
问题内容

当喜欢LinkedBlockingQueueArrayBlockingQueue

何时LinkedBlockingQueue以及ArrayBlockingQueue何时使用哪种数据结构:

  1. 您想要高效的读写
  2. 应该具有更少的内存占用

尽管存在类似的问题,但它并没有突出表明应该优先选择哪个事实?


问题答案:

蜘蛛侠鲍里斯(Boris the
Spider)已经概述了ArrayBlockingQueue和之间最明显的区别LinkedBlockingQueue-前者始终是有界的,而后者可以是无界的。

因此,如果您需要无限制的阻塞队列,LinkedBlockingQueue或者将其LinkedTransferQueue用作工具箱BlockingQueue中的最佳选择java.util.concurrent

但是,假设您需要一个有限的阻塞队列。最后,您应该基于对真实工作负载进行模拟的广泛实验来选择一种实现。不过,以下是一些注释,可以帮助您进行选择或解释实验结果:

  • ArrayBlockingQueue可以使用可配置(开/关)调度公平性策略创建。如果您需要公平或希望避免生产者/消费者饥饿,那么这很好,但是这会浪费您的吞吐量。
  • ArrayBlockingQueue 预分配其后备数组,因此它在使用过程中不会分配节点,但会立即占用相当大的内存块,如果您的内存碎片化,则可能会出现问题。
  • ArrayBlockingQueue 应该具有较小的性能差异,因为它总体上具有较少的运动部件,它使用了一种更简单且不太复杂的单锁算法,在使用过程中不创建节点,并且其缓存行为应相当一致。
  • LinkedBlockingQueue 应该具有更好的吞吐量,因为它为头部和尾部使用了单独的锁。
  • LinkedBlockingQueue 不会预分配节点,这意味着它的内存占用空间将大致与其大小匹配,但这也意味着它将为分配和释放节点带来一些工作。
  • LinkedBlockingQueue 缓存行为可能更糟,这可能会影响其自身的性能,还可能由于错误共享而影响其他组件的性能。

根据您的使用情况,并做了多少你关心性能,你可能还需要的外观之外java.util.concurrent,并考虑干扰物(一个非常快,但有些专门界无阻塞环形缓冲区)或JCTools(各种界或无界根据生产者和消费者的数量,具有不同保证的队列)。



 类似资料:
  • 问题内容: 我的要求是仅显示跨数据库从数据库检索的一组值。我正在使用jQuery。 问题答案: 如果满足以下任一条件,则将XML优先于JSON: 您需要消息验证 您正在使用XSLT 您的消息中包含很多标记文字 您需要与不支持JSON的环境进行互操作 当所有这些都成立时,在XML上偏爱JSON: 不需要验证消息,或者验证消息的反序列化很简单 您不是要转换邮件,也不是转换邮件的反序列​​化很简单 您的

  • 问题内容: 我正在实现一个API,有一个方法可以传递程序从中读取资源的路径列表 我正在使用varargs使调用方法尽可能方便用户,就像这样 这是varargs的适当用法吗?还是传递数组更好? 问题答案: 在您的情况下,varargs很好。您实际上并不需要对要导入的路径进行数组处理,因为除了将它们传递给您的方法外,您不需要执行任何其他操作。 varargs功能使您不必为了将一组值传递给一次性方法而显

  • 问题内容: 我正在使用Eclipse生成和,并且有一个标记为“使用比较类型”的选项。缺省是不选中此选项并用于比较类型。有什么我比我更喜欢的理由吗? 不使用: 使用: 我通常会选中该选项,然后去掉“ ”检查。(这是多余的,因为空对象将始终失败。)是否有任何不好的主意? 问题答案: 如果你使用,让你实现将保留方法的对称性合同:。如果看似有限制,请仔细检查你的对象等效性概念,以确保你的首要实现完全维护类

  • 我读了这个答案,最后写了以下内容: 任何你可以用易失性来完成的事情都可以用同步来完成,但反之亦然。 不清楚。JLS8.3.1.4定义易失性字段如下: 一个字段可以被声明为易失性的,在这种情况下,Java内存模型确保所有线程看到变量的一致值(§17.4)。 所以,易失性字段是关于内存可见性的。此外,就我引用的答案而言,对不稳定字段的读写是同步的。 同步,进而保证只有一个线程可以访问同步块。据我所知,

  • 问题内容: 码 输出量 这是预期的行为吗?如果是这样,那为什么呢?我期望:char,Int 注意:我正在使用Java 8 问题答案: 当编译器确定选择哪种重载方法时,带有varargs()的方法具有最低的优先级。因此,当您使用单个参数调用时会选择,因为a 可以自动提升为。 JLS 15.12.2 : 第一阶段(第15.12.2.2节)执行重载解析 ,不允许 装箱或拆箱转换,也 不允许 使用可变Ar

  • 我想知道什么时候应该使用顶级常量,什么时候应该使用伴星对象?如果财产是私有的还是公共的,我应该考虑使用什么? 或者我应该使用: 当我们处理可见性时,使用什么很重要吗?