队列

队列特性

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

对比队列和栈

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

基于数组的队列

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

对比队列学习循环队列

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

循环队列难点

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

阻塞队列

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

并发队列

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

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

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

阻塞方式:

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

注意
队列_第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

你可能感兴趣的:(队列)