队列特性
1.基于数组:顺序队列。
2.基于链表:链式队列。
对比队列和栈
1.栈只需要一个栈顶指针。
2.队列需要一个head指针和一个tail指针。
基于数组的队列
1.每次出队,需要搬移数据保证连续性。对此的优化方案:在入队的时候无空间可用,再集中搬移一次数据。
对比队列学习循环队列
1.基于数组的队列在tail==n时会触发数据搬移操作。影响入队操作。
2.循环队列可以避免数据搬移操作。
循环队列难点
1.判断边界条件
对满条件:(tail+1)%n=head 注意:队满的时候,tail指向的位置没有数据。所以循环链表会浪费一个数组的存储空间。
对空条件:head==tail
阻塞队列
1.在队列基础上加入阻塞操作。(生产者消费者模式)
2.在生产者消费者模式中,如果一个生产者对应多个消费者。在这种多线程环境下会出现线程安全问题。
并发队列
1.线程安全的队列叫做并发队列。
2.最简单的方式是在入队、出队操作上加锁。这会导致锁的粒度大并发低。同一时刻只允许一个存或者取操作。基于数组的循环队列,利用CAS原子操作,可以实现非常高效的并发队列。
应用:线程池中拒绝策略。
1.非阻塞方式,直接拒绝。
2.阻塞方式,请求排队。
阻塞方式:
1.基于链表:可实现无限排队无界队列。请求过多会导致响应时间过长,对于响应时间敏感的系统,基于链表实现无限排队的线程池是不合适的。
2.基于数组:有界队列,超过队列大小会拒绝。对时间敏感的系统合理。设置一个合理大小的队列很有讲究。
注意

网友评论