并发编程-阻塞队列(Blocking Queue)

目录

一、生产者、消费者概念

二、JUC阻塞队列的存取方法

 三、阻塞队列

1、定义

2、背景与解决的问题

3、常见阻塞队列及原理

4、差异对比

1、数据结构

2、容量限制

3、锁机制

4、特殊功能


一、生产者、消费者概念

        生产者、消费者是设计模式的一种。

        作用:让生产者、消费者基于一个容器来解决强耦合问题

        实现:生产者、消费者彼此之间不会直接通讯,而是通过一个容器(队列)进行通讯。

  • 生产者生产完数据后扔到容器中,不需要等待消费者来处理数据。
  • 消费者需要消费数据时,不需要去找生产者索取数据,直接从容器中获取。

        这种容器最常见的就是队列

二、JUC阻塞队列的存取方法

常用的存取方法都是来自于JUC包下的BlockingQueue

生产者存储方法

  • add(E)
    • 添加数据到队列,如果队列满了,无法存储,抛出异常
  • offer(E)
    • 添加数据到队列,如果队列满了,返回false
  • offer(E,timeout,unit)
    • 添加数据到队列,如果队列满了,阻塞timeout时间,如果阻塞一段时间,依然没添加进入,返回false
  • put(E)
    • 添加数据到队列,如果队列满了,挂起线程,等到队列中有位置,再扔数据进去,死等!

 消费者取数据方法

  • remove()    
    • 从队列中移除数据,如果队列为空,抛出异常
  • poll()         
    • 从队列中移除数据,如果队列为空,返回null。
  • poll(timeout,unit)  
    • 从队列中移除数据,如果队列为空,挂起线程timeout时间,等生产者扔数据,再获取
  • take()        
    • 从队列中移除数据,如果队列为空,线程挂起,一直等到生产者扔数据,再获取,死等

 三、阻塞队列

1、定义

阻塞队列(Blocking Queue)是一种支持线程安全的队列

  • 阻塞插入:但队列满时,插入元素的线程被阻塞,直到队列有空位。
  • 阻塞移除:当队列为空时,移除元素的线程被阻塞,知道队列有新元素。
  • 超时操作:支持在阻塞时设置超时时间,超时后放弃操作。

2、背景与解决的问题

  1. 线程协调问题:生产者和消费者速率不一样(生产者生产数据的效率,消费者消费数据的效率 不一样),需要避免忙等待,减少资源浪费。
  2. 解耦生产者与消费者:通过队列隔离生产者和消费者,双方无需直接感知对方状态。
  3. 流量控制:通过有界队列限制资源使用,防止内存溢出或系统过载。

3、常见阻塞队列及原理

队列类型数据结构容量锁机制特点
ArrayBlockingQueue数组有界单锁(ReentrantLock)固定大小,公平/非公平锁,入队出队共用锁。
LinkedBlockingQueue链表可选有界双锁(分离读/写)默认无界(Integer.MAX),高吞吐量。
PriorityBlockingQueue堆(数组实现)无界单锁元素按优先级排序,支持自定义比较器。
SynchronousQueue无存储结构容量为0CAS或TransferStack直接传递数据,生产者需等待消费者接收。
DelayQueue优先级堆无界单锁元素需实现Delayed接口,到期才能取出。
LinkedTransferQueue链表无界CAS优化支持“匹配模式”(生产者和消费者直接交换)。

4、差异对比

1、数据结构

  • ArrayBlockingQueue:基于数组,内存连续,适合固定大小场景
  • LinkedBlockingQueue:基于链表,动态扩展,适合高吞吐量。
  • PriorityBlockingQueue:通过二叉堆实现优先排序

2、容量限制

  • ArrayBlockingQueue:严格有界
  • LinkedBlockingQueue:默认无界(Integer.MAX)
  • SynchronousQueue:容量为0,强制生产者-消费者同步

3、锁机制

  • ArrayBlockingQueue:单锁,可能成为性能瓶颈
  • LinkedBlockingQueue: 双锁,读写锁,提高并发度
  • SynchronousQueue: 无锁,基于CAS或栈/队列结构

4、特殊功能

  • DelayQueue:用于延迟任务(eg. 定时调度)
  • LinkedTransferQueue:支持数据直接传递,减少中间存储
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值