没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
17页
6.JUC并发工具类在大厂的应用场景详解 (1).pdf 7、深入理解 AQS 独占锁之 Reentrantlock 源码分析 (1).pdf 8、读写锁ReentrantReadWriteLock&StampLock详解.pdf 9、并发容器 (Map、List、Set) 实战及其原理.pdf 10、阻塞队列BlockingQueue 实战及其原理分析.pdf
资源推荐
资源详情
资源评论
主讲老师:Fox老师
有道笔记链接:
阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程
安全的队列访问方式:当阻塞队列插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从
https://note.youdao.com/s/U6CaYXOB
1. 阻塞队列介绍
1.1 队列
是限定在一端进行插入,另一端进行删除的特殊线性表。
先进先出(FIFO)线性表。
允许出队的一端称为队头,允许入队的一端称为队尾。
Queue接口
public interface Queue<E> extends Collection<E> {1
//添加一个元素,添加成功返回true, 如果队列满了,就会抛出异常2
boolean add(E e);3
//添加一个元素,添加成功返回true, 如果队列满了,返回false4
boolean offer(E e);5
//返回并删除队首元素,队列为空则抛出异常6
E remove();7
//返回并删除队首元素,队列为空则返回null8
E poll();9
//返回队首元素,但不移除,队列为空则抛出异常10
E element();11
//获取队首元素,但不移除,队列为空则返回null12
E peek();13
}14
1.2 阻塞队列
阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实
现都是基于BlockingQueue实现的。
阻塞队列在实际应用中有很多场景,以下是一些常见的应用场景:
线程池中的任务队列通常是一个阻塞队列。当任务数超过线程池的容量时,新提交的任务将被放入任
务队列中等待执行。线程池中的工作线程从任务队列中取出任务进行处理,如果队列为空,则工作线
程会被阻塞,直到队列中有新的任务被提交。
在生产者-消费者模型中,生产者向队列中添加元素,消费者从队列中取出元素进行处理。阻塞队列可
以很好地解决生产者和消费者之间的并发问题,避免线程间的竞争和冲突。
消息队列使用阻塞队列来存储消息,生产者将消息放入队列中,消费者从队列中取出消息进行处理。
消息队列可以实现异步通信,提高系统的吞吐量和响应性能,同时还可以将不同的组件解耦,提高系
统的可维护性和可扩展性。
缓存系统使用阻塞队列来存储缓存数据,当缓存数据被更新时,它会被放入队列中,其他线程可以从
队列中取出最新的数据进行使用。使用阻塞队列可以避免并发更新缓存数据时的竞争和冲突。
在并发任务处理中,可以将待处理的任务放入阻塞队列中,多个工作线程可以从队列中取出任务进行
处理。使用阻塞队列可以避免多个线程同时处理同一个任务的问题,并且可以将任务的提交和执行解
耦,提高系统的可维护性和可扩展性。
总之,阻塞队列在实际应用中有很多场景,它可以帮助我们解决并发问题,提高程序的性能和可靠
性。
BlockingQueue接口
方法 抛出异常 返回特定值 阻塞 阻塞特定时间
入队 add(e) offer(e) put(e)
offer(e, time,
unit)
出队 remove() poll() take() poll(time, unit)
获取队首元素 element() peek() 不支持 不支持
应用场景
线程池
生产者-消费者模型
消息队列
缓存系统
并发任务处理
1.
2.
3.
4.
5.
BlockingQueue 接口的实现类都被放在了 juc 包中,它们的区别主要体现在存储结构上或对元素操作
上的不同,但是对于take与put操作的原理却是类似的。
ArrayBlockingQueue是最典型的有界阻塞队列,其内部是用数组存储元素的,初始化时需要指定
容量大小,利用 ReentrantLock 实现线程安全。ArrayBlockingQueue可以用于实现数据缓存、限
流、生产者-消费者模式等各种应用。
在生产者-消费者模型中使用时,如果生产速度和消费速度基本匹配的情况下,使用
ArrayBlockingQueue是个不错选择;当如果生产速度远远大于消费速度,则会导致队列填满,大量生
产线程被阻塞。
1.3 JUC包下的阻塞队列
队列 描述
ArrayBlockingQueue 基于数组结构实现的一个有界阻塞队列
LinkedBlockingQueue
基于链表结构实现的一个无界阻塞队列,指定容
量为有界阻塞队列
PriorityBlockingQueue 支持按优先级排序的无界阻塞队列
DelayQueue
基于优先级队列(PriorityBlockingQueue)实现
的无界阻塞队列
SynchronousQueue 不存储元素的阻塞队列
LinkedTransferQueue 基于链表结构实现的一个无界阻塞队列
LinkedBlockingDeque 基于链表结构实现的一个双端阻塞队列
https://www.processon.com/view/link/618ce3941e0853689b0818e2
2. ArrayBlockingQueue
2.1 ArrayBlockingQueue使用
BlockingQueue queue = new ArrayBlockingQueue(1024);1
queue.put("1"); //向队列中添加元素2
Object object = queue.take(); //从队列中取出元素3
ArrayBlockingQueue使用独占锁ReentrantLock实现线程安全,入队和出队操作使用同一个锁对象,
也就是只能有一个线程可以进行入队或者出队操作;这也就意味着生产者和消费者无法并行操作,在
高并发场景下会成为性能瓶颈。
利用了Lock锁的Condition通知机制进行阻塞控制。
核心:一把锁,两个条件
2.2 ArrayBlockingQueue的原理
数据结构
//数据元素数组1
final Object[] items;2
//下一个待取出元素索引3
int takeIndex;4
//下一个待添加元素索引5
int putIndex;6
//元素个数7
int count;8
//内部锁9
final ReentrantLock lock;10
//消费者11
private final Condition notEmpty;12
//生产者13
private final Condition notFull; 14
15
public ArrayBlockingQueue(int capacity) {16
this(capacity, false);17
}18
public ArrayBlockingQueue(int capacity, boolean fair) {19
...20
lock = new ReentrantLock(fair); //公平,非公平21
notEmpty = lock.newCondition();22
notFull = lock.newCondition();23
}24
25
入队put方法
剩余16页未读,继续阅读
资源评论
代码匠心印记
- 粉丝: 483
- 资源: 30
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- yolo目标检测项目实验
- downloadFile-1.hc
- Centos7.9环境下离线安装开源版Nginx(亲测版)
- C++课程设计:基于Qt的航班信息管理系统
- ADS7822UVerilog驱动,前面传的有点问题
- 基于python的高性能爬虫程序,使用了多线程+缓存+xpath实现的,这里以彼-岸图库为例,实现,仅用于学习交流
- 中分辨率成像光谱仪(MODIS)烧毁面积产品信息MODIS-C6-BA-User-Guide-1.2.pdf
- Screenshot_20240427_172613_com.huawei.browser.jpg
- 关于学习Python的相关资源网站链接及相关介绍.docx
- (HAL库)基于STM32F103C8T6的温控PID系统[Dht11、ESP8266、无线透传、L298N……]
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功