【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
底层实现 数组 链表
容量 固定 可指定容量,也可动态增长
锁设计 单锁 双锁
性能 高性能,适合高并发场景 性能稍逊,但适合生产者和消费者分离的场景
内存占用 低,占用固定内存 高,占用动态分配的内存
适用场景 数据量可控、内存敏感、性能要求高的场景 数据量不确定、高并发、内存不敏感的场景
相关推荐
小张快跑。7 分钟前
Maven指定版本下载以及相关配置
java·maven
zhishidi9 分钟前
Spring @Scheduled注解调度机制详解
java·python·spring
⑩-10 分钟前
Blocked与Wati的区别
java·开发语言
AAA简单玩转程序设计12 分钟前
救命!Java这3个小技巧,写起来爽到飞起✨
java
IManiy18 分钟前
Java表达式引擎技术选型分析(SpEL、QLExpress)
java·开发语言
历程里程碑26 分钟前
C++ 17异常处理:高效捕获与精准修复
java·c语言·开发语言·jvm·c++
雨雨雨雨雨别下啦28 分钟前
ssm复习总结
java·开发语言
速易达网络1 小时前
基于Java Servlet的用户登录系统设计与实现
java·前端·mvc
拾贰_C1 小时前
【python | pytorch | 】.报错怎么找到问题所在?
开发语言·pytorch·python
散一世繁华,颠半世琉璃1 小时前
从 0 到 1 优化 Java 系统:方法论 + 工具 + 案例全解析
java·性能优化·操作系统