【Java】BlockQueue

一,概述

消费者生产者经典阻塞队列,其定义是,如果队列已满,阻塞生产者添加元素到队列;如果队列为空,阻塞消费者从队列中取元素。阻塞方法是put和take,非阻塞方法是offer和poll

代表实现是LinkedBlockQueue

二,实现

LinkedBlockQueue

offer

1,put锁#lock

2,如果队列已满,使用notFull.awaitNaos阻塞offer操作,put方法在此处同理,只是无超时参数

3,新Node节点入队

4,如果队列未满,则唤醒其他生产者(串行唤醒)

5,如果getAndIncrement返回的是0,则代表队列此前为空,则通过notEmpty唤醒第一个await节点的消费者

take

1,take锁#lock

2,如果队列空,阻塞take

3,出队

4,唤醒其它消费者线程(串行唤醒)

5,如果getAndDecrement前已经满,此前的put操作存在阻塞,因此通过notFull唤醒第一个await节点的生产者

ArrayBlockQueue

put

1,lock

2,达到最大长度,await挂起

3,入队

4,enqueue后,便调用notEmpty唤醒一个消费者

take

1,lock

2,队列为空,await挂起

3,出队

4,只要出队,便唤醒一个生产者

对比总结

特性 ArrayBlockingQueue LinkedBlockingQueue
底层实现 数组 链表
容量 固定 可指定容量,也可动态增长
锁设计 单锁 双锁
性能 高性能,适合高并发场景 性能稍逊,但适合生产者和消费者分离的场景
内存占用 低,占用固定内存 高,占用动态分配的内存
适用场景 数据量可控、内存敏感、性能要求高的场景 数据量不确定、高并发、内存不敏感的场景
相关推荐
梵刹古音2 分钟前
【C语言】 格式控制符与输入输出函数
c语言·开发语言·嵌入式
Acrelhuang8 分钟前
工商业用电成本高?安科瑞液冷储能一体机一站式解供能难题-安科瑞黄安南
大数据·开发语言·人工智能·物联网·安全
hello 早上好9 分钟前
03_JVM(Java Virtual Machine)的生命周期
java·开发语言·jvm
沐雪架构师10 分钟前
LangChain 1.0 Agent开发实战指南
开发语言·javascript·langchain
tod11311 分钟前
力扣高频 SQL 50 题阶段总结(四)
开发语言·数据库·sql·算法·leetcode
2501_9400078922 分钟前
Flutter for OpenHarmony三国杀攻略App实战 - 战绩记录功能实现
开发语言·javascript·flutter
naruto_lnq22 分钟前
C++中的桥接模式
开发语言·c++·算法
无限进步_23 分钟前
面试题 02.02. 返回倒数第 k 个节点 - 题解与详细分析
c语言·开发语言·数据结构·git·链表·github·visual studio
夕除27 分钟前
js--7
java
布谷歌31 分钟前
面试题整理
java·开发语言