队列面试分析

1.了解的队列结构

  • 单端队列: 只支持一端入队(enqueue),一端出队(dequeue)。
  • 双端队列:支持队列的两端进行入队和出队操作。
  • 循环队列:可提供更好的性能,降低时间复杂度。
  • 阻塞队列:生产者和消费者应用模型中的一种容器,在队列空或满的时候进行阻塞。
  • 优先级队列:支持按优先级操作的的队列结构(内部对元素进行排序)。
  • ……。

2.Java中常见的阻塞式队列都有哪些?

  • ArrayBlockingQueue :基于数组结构实现的的有界阻塞队列。
  • LinkedBlockingQueue :基于链表结构实现的无界阻塞队列(可以认为设定有界)。
  • PriorityBlockingQueue :支持优先级排序的无界阻塞队列。
  • DelayQueue:支持延迟操作的无界阻塞队列(基于PriorityQueue队列实现)。
  • SynchronousQueue:一个不存储元素,无缓冲等待的阻塞队列,直接将任务扔给消费者。
  • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列(任务传送,性能更好)。
  • LinkedBlockingDeque:基于链表结构实现的双端阻塞队列(Deque)。

3.Java中ArrayBlockingQueue 实现?

ArrayBlockingQueue 是一个有边界的阻塞队列,它的内部实现是一个数组。它的容量是有限的,我们必须在其初始化的时候指定它的容量大小,容量大小一旦指定,其大小不可改变。其内部的阻塞方式是通过重入锁 ReenterLock 和 Condition 条件队列实现的,但是队列中的锁是没有分离的,即添加操作和移除操作采用的同一个ReenterLock锁,这样就会导致入队和出队操作不能同时进行。

4.Java中LinkedBlockingQueue 实现?

LinkedBlockingQueue采用的是一种基于单链表实现的阻塞式无界队列。此队列在添加一个元素时会创建一个新的Node对象。删除一个元素时要移除一个节点对象。频发的创建和销毁可能对GC操作有较大影响。但是,此队列中的锁(Lock)是分离的,其添加操作采用的是putLock,移除操作采用的则是takeLock,这样能大大提高队列的吞吐量,也意味着在高并发的情况下生产者和消费者可以并行地操作队列中的数据,以此来提高整个队列的并发性能。

5.Java中ConcurrentLinkedQueue的实现?

ConcurrentLinkedQueue是一个基于单链表实现的、线程安全的、非阻塞式无界队列。此队列的设计也非常考验设计功底,其内部全程使用了cas操作,并且在边界控制方面也引入了哨兵机制。总之,设计复杂程度远远高于直接使用锁(Lock)对象方式的线程安全队列的实现。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值