队列是一种先进先出的操作首先的线性表。分为顺序队列和链式队列,还有额外特性的队列,比如循环队列,阻塞队列,并发队列。入队时,tail->next= new_node, tail = tail->next;出队时,head =head->next。对满:tail=n,对空:head=tail。
1.循环队列
循环队列,首尾相连形成一个环。数组实现的循环队列,对满:(tail+1)%n=head,对空:head == tail,会浪费一个数组的存储空间。
2.阻塞队列
阻塞队列就是在队列的基础上增加了阻塞操作。队列为空时,出队会被阻塞;队列满时,入队会被阻塞。可以实现生产者-消费者模型。
3.并发队列
线程安全的队列叫做并发队列。最简单直接的实现方式是直接在 enqueue()、dequeue() 方法上加锁,但是锁粒度大并发度会比较低,同一时刻仅允许一个存或者取操作。基于数组的循环队列,利用 CAS 原子操作,可以实现非常高效的并发队列。
CAS(Compare-and-Swap),即比较并替换,是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技术。
4.在有限资源中的应用
-
1.非阻塞处理方式,直接拒绝任务请求。
-
2.阻塞处理方式,将请求排队,有空闲线程时在处理。
-
链表实现无限排队的无界队列,但是会导致过多的请求排队响应时间长。不适合线程池。
-
数组实现的有界队列,请求超过队列大小时,请求会被拒绝。需要合理设置队列大小。