1、队列在线程池等有限资源池中的应用==》当我们向固定大小的线程池中请求一个线程时,如果线程池中没有空闲资源了,这个时候线程池如何处理这个请求?是拒绝请求还是排队请求?各种处理策略又是怎么实现的呢?==》队列Queue 非阻塞的处理方式:直接拒绝任务请求;阻塞的处理方式:将请求排队,等到有空闲线程时,取出排队的请求继续处理
先进者先服务==》队列
基于链表的实现方式,可以实现一个支持无限排队的无界队列,但是可能会导致过多的请求排队等待,请求处理的响应时间过长
基于数组实现的有界队列(bounded queue),队列的大小有限,所以线程池中排队的请求超过队列大小时,接下来的请求就会被拒绝,
2、队列==》先进先出 入队enqueue() 出队dequeue() 队列跟栈一样也是一种操作受限的线性表数据结构
循环队列、阻塞队列、并发队列==》高性能队列Disruptor、Linux环形缓存,都用到了循环并发队列;Java concurrent并发包利用ArrayBlockingQueue来实现公平锁
3、顺序队列和链式队列==》数组实现;链表实现 数组实现:数据搬移操作
4、循环队列==》避免数据搬移 确定好队空和队满的判定条件 在用数组实现的非循环队列中,队满的判断条件是tail==n,队空的判断条件是head==tail 循环队列中,队空的判断条件head==tail 队满的判断条件(tail+1)%n==head 当队列满时, tail 指向的位置实际上是没有存储数据的。所以,循环队列会浪费一个数组的存储空间。
5、阻塞队列和并发队列==》阻塞队列其实就是在队列基础上增加了阻塞操作,在队列为空的时候,从队头取数据会被阻塞,直到队列中有了数据才能返回;如果队列已经满了,那么插入数据的操作就会被阻塞,直到队列中有空闲位置后再插入数据,然后再返回
线程安全的队列叫作并发队列。最简单直接的实现方式是直接在enqueue()、dequeue()方法上加锁,但是锁粒度大并发度会比较低,同一时刻仅允许一个存或者取操作==》基于数组的循环队列,利用CAS原子操作,可以实现非常高效的并发队列