美文网首页
阻塞队列

阻塞队列

作者: 蓝调_4f2b | 来源:发表于2023-06-14 13:29 被阅读0次

1.BlockingQueue接口

继承了Queue接口,为队列的一种类型,区别于队列的2种操作为:
(1)put:队列满时,队列阻塞插入元素线程
(2)take:队列阻塞时,获取元素线程阻塞
思考:阻塞队列是否有容量限制?
看种类,有界队列以ArrayBlockingQueue为主;无界以LinkedBlockingQueue为主;

2. ArrayBlockingQueue

最典型的有界队列
由数组存储元素,初始化时需指定大小;
利用ReentrantLock实现线程安全;
最佳实践:生产者与消费者速度基本匹配时使用;
(1)入队逻辑:

void put(E e) {
  final ReentrantLock lock = this.lock;
  lock.lockInterruptibly();
  try {
    while (count == items.length) {
      notfull.await();   // 队列满,阻塞
    } 
    enqueue(e);
  } finally {
    lock.unlock();
  }
}

(2)出队逻辑:

void enqueue(E x) {
  final Object[] items = this.items;
  items[putIndex] = x;
  if (++putIndex == items.length) {
      putIndex = 0; // 队列满时,指针归0,相较于删除O(n),时间消耗为O(1)
  }
  count++;
  notEmpty.signal(); // 唤醒消费线程,开始消费
}

3. LinkedBlockingQueue

基于链表实现的阻塞队列,为无界队列

3.1 重要特性:读写锁分离

final ReentrantLock takeLock, putLock分别控制进出
Conditional notEmpty, notFull作为进出条件队列

3.2 使用场景

(1)线程池重要组成:读写锁分离,高效率

4. LinkedBlockingDeque

类似LinkedBlockingQueue;区别在于该队列为双向队列;并可控制出入队规则

5. synchronousQueue同步队列

一个没有数据缓冲的BlockingQueue,容量为0,不会为队列中的元素维护储存空间,仅负责多线程的交换
(1)特性:提供公平/非公平两种锁(栈/队列)
(2)使用流程,以队列为例:
入队:构造Node节点入队,并阻塞当前线程
出队:将队首/尾节点唤醒,进行出队
(3)应用场景:对账及批跑
对应一个生产者, 仅有一个消费者:一对一处理关系
如在线程池中,不确定生产者请求数量,且需要实时处理任务,可选择该队列为每个生产者分配一个消费者
例如:在Executor.newCachedThreadPool采用了该种思路

6. PriorityBlockingQueue 优先级队列

一种无界的基于数组优先级的阻塞队列
(1)使用场景:电商抢购,会员级别高的先出队列
(2)数据结构:二叉堆(大顶堆,小顶堆)
(3)相关代码:

7. 延迟队列

(1)实现:由优先级队列
(2)使用场景:超时关单,任务的超时处理,mq挂掉后的重启

相关文章

  • 并发编程之并发队列

    常见的并发队列有2种:阻塞队列和非阻塞队列。阻塞队列使用锁实现,非阻塞队列使用CAS非阻塞算法实现。这2种队列都是...

  • 探讨阻塞队列和线程池源码

    阻塞队列 非阻塞队列是一个先进先出的单向队列(Queue),而BlockingQueue阻塞队列实际是非阻塞队列的...

  • 阻塞队列(一)(BlockingQueue)

    阻塞队列概要 阻塞队列与我们平常接触的普通队列(list)最大的不同点,在于阻塞队列支持阻塞添加和阻塞删除方法。 ...

  • Java多线程之阻塞队列

    一基本概念:1:什么叫阻塞队列阻塞队列都是相对于非阻塞队列而言的,非阻塞队列就是队列不会对当前线程产生阻塞;例如当...

  • 18.阻塞队列

    [TOC] 阻塞队列 阻塞队列首先是一种队列的数据结构,阻塞表现在此队列提供了操作数据的阻塞方法:阻塞队列提供了可...

  • 以LinkedBlockingQueue为例浅谈阻塞队列的实现

    目录 阻塞队列简介阻塞队列的定义Java中的阻塞队列 LinkedBlockingQueue单链表定义锁和等待队列...

  • Android中的线程与线程池

    阻塞队列BlockingQueue 阻塞队列常用于生产者——消费者模型,生产者往阻塞队列插入数据,消费者往阻塞队列...

  • 有关java多线程的文章

    先行概念 阻塞队列和非阻塞队列 阻塞和非阻塞队列的区别概念:https://www.cnblogs.com/min...

  • 线程池

    [TOC] 线程池 1. 并发队列:阻塞队列和非阻塞队列 区别如下: 入队: 非阻塞队列:当队列中满了的时候,放入...

  • 【并发编程系列8】阻塞队列之ArrayBlockingQueue

    什么是阻塞队列 阻塞队列有两个特点: 当队列中没有元素时,从队列中获取元素会被阻塞 当队列满了时,添加元素会被阻塞...

网友评论

      本文标题:阻塞队列

      本文链接:https://www.haomeiwen.com/subject/fkzhydtx.html