zoukankan      html  css  js  c++  java
  • 04:队列

    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原子操作,可以实现非常高效的并发队列

  • 相关阅读:
    桶排序
    Ultra-QuickSort
    Merge Sort
    Max Sum
    快排
    Oil Deposits
    1009: josephus问题
    A+B Again(在某个数中找大于m的最小约数)
    luogu4181 [USACO18JAN]Rental Service (贪心)
    luogu4185 [USACO18JAN]MooTube (并查集)
  • 原文地址:https://www.cnblogs.com/liushoudong/p/13508019.html
Copyright © 2011-2022 走看看