队列

作者: 写啥呢 | 来源:发表于2019-06-18 18:04 被阅读0次

队列特性

1.基于数组:顺序队列。
2.基于链表:链式队列。

对比队列和栈

1.栈只需要一个栈顶指针。
2.队列需要一个head指针和一个tail指针。

基于数组的队列

1.每次出队,需要搬移数据保证连续性。对此的优化方案:在入队的时候无空间可用,再集中搬移一次数据。

对比队列学习循环队列

1.基于数组的队列在tail==n时会触发数据搬移操作。影响入队操作。
2.循环队列可以避免数据搬移操作。

循环队列难点

1.判断边界条件
    对满条件:(tail+1)%n=head  注意:队满的时候,tail指向的位置没有数据。所以循环链表会浪费一个数组的存储空间。
    对空条件:head==tail  

阻塞队列

1.在队列基础上加入阻塞操作。(生产者消费者模式)
2.在生产者消费者模式中,如果一个生产者对应多个消费者。在这种多线程环境下会出现线程安全问题。
IMG_1548.JPG

并发队列

1.线程安全的队列叫做并发队列。
2.最简单的方式是在入队、出队操作上加锁。这会导致锁的粒度大并发低。同一时刻只允许一个存或者取操作。基于数组的循环队列,利用CAS原子操作,可以实现非常高效的并发队列。

应用:线程池中拒绝策略。

1.非阻塞方式,直接拒绝。
2.阻塞方式,请求排队。

阻塞方式:

1.基于链表:可实现无限排队无界队列。请求过多会导致响应时间过长,对于响应时间敏感的系统,基于链表实现无限排队的线程池是不合适的。
2.基于数组:有界队列,超过队列大小会拒绝。对时间敏感的系统合理。设置一个合理大小的队列很有讲究。
注意 规范.png

参考书阿里巴巴规范:https://github.com/alibaba/p3c/blob/master/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%EF%BC%88%E8%AF%A6%E5%B0%BD%E7%89%88%EF%BC%89.pdf

相关文章

  • 队列

    队列特性 对比队列和栈 基于数组的队列 对比队列学习循环队列 循环队列难点 阻塞队列 并发队列 应用:线程池中拒绝...

  • 队列

    文章结构 什么是队列 实现队列顺序队列链式队列循环队列 Java中的队列 1. 什么是队列 队列也是一种操作受限的...

  • iOS底层-- GCD源码分析(1)-- dispatch_qu

    手动目录认识队列队列的结构队列的产生主队列全局队列创建的队列管理队列 代码版本dispatch version :...

  • 队列,异步,同步,线程通俗理解

    一、队列 串行队列 并行队列 主队列(只在主线程执行的串行队列) 全局队列(系统的并行队列) 二、 任务(是否具有...

  • GCD基础总结一

    上代码~ 同步串行队列 同步并行队列 异步串行队列 异步并行队列 主队列同步 会卡住 主队列异步

  • OC多线程

    队列创建 线程与队列 队列线程间通信 队列组

  • GCD

    获得主队列 获得全局队列 串行队列 异步队列 同步队列 阻隔队列 (像栅栏一样 ) 例如 A -->栅栏 --...

  • 数据结构第三篇 队列

    队列的特性 前进先出。 我们来大致描述下进出队列的情况。 进队列 1 进队列现在队列是 12 进队列现在队列是 1...

  • 利用链表实现队列

    队列成员变量: 队列长度 队列头节点 队列尾节点队列方法: 队列包含元素个数 队列是否为空 进队操作 出队操作 d...

  • Git 常用操作命令(持续更新)

    当前更新到stash队列 查看stash队列 清空队列 删除某个队列

网友评论

      本文标题:队列

      本文链接:https://www.haomeiwen.com/subject/ehcqqctx.html