阻塞队列
BlockingQueue
1、通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出
(1)当队列是空的,从队列中获取元素的操作将会被阻塞
(2)当队列是满的,从队列中添加元素的操作将会被阻塞
(3)试图从空的队列中获取元素的线程将会被阻塞,直到其他线程往空的队列插入新的元素
(3)试图向已满的队列中添加新元素的线程将会被阻塞,直到其他线程从队列中移除一个或多个元素或者完全清空,使队列空闲并后续新增
2、常用队列
(1)先进先出(FIFO):先插入的队列的元素也最先出队列,类似于排队
(2)后进先出(LIFO):后插入队列的元素最先出队列,这种队列优先处理最近发生的事件(栈)
ArrayBlockingQueue
1、由数组结构组成的有界阻塞队列
(1)内部维护一个定长数组,以便缓存队列中的数据对象
(2)内部保存两个整形变量,分别标识着队列的头部、尾部在数组中的位置
2、在生产者放入数据、消费者获取数据,都是共用同一个锁对象,两者无法真正并行运行
(1)按照实现原理来分析,ArrayBlockingQueue 完全可以采用分离锁,从而实现生产者和消费者操作的完全并行运行
(2)因为 ArrayBlockingQueue 的数据写入、获取操作已经足够轻巧
(3)引入独立的锁机制,给代码带来额外的复杂性,且难以提高性能
3、在插入或删除元素时,不会产生或销毁任何额外的对象实例
4、在创建 ArrayBlockingQueue 时,可以控制对象的内部锁是否采用公平锁,默认采用非公平锁
LinkedBlockingQueue
1、由链表结构组成的有界阻塞队列
(1)大小默认值为 integer.MAX_VALUE
(2)内部维持着一个数据缓冲队列,该队列由一个链表构成
2、对于生产者端、消费者端,分别采用独立锁控制数据同步
(1)生产者、消费者可以并行地操作队列中的数据,提高整个队列的并发性能
(2)一般情况下,在处理多线程间的生产者消费者问题,使用 ArrayBlockingQueue、LinkedBlockingQueue
DelayQueue
1、使用优先级队列实现的延迟无界阻塞队列
2、其中元素只有到其指定延迟时间,才能够从队列中获取到该元素
3、一个没有大小限制的队列,插入数据的操作(生产者)永远不会被阻塞,而只有获取数据的操作(消费者)才会被阻塞
PriorityBlockingQueue
1、支持优先级排序的无界阻塞队列
(1)判断优先级,通过构造函数传入 Compator 对象决定
(2)不会阻塞数据生产者,而只会在没有可消费的数据时,阻塞数据的消费者
(3)使用注意:生产者生产数据的速度,绝对不能快于消费者消费数据的速度,否则时间一长,最终耗尽所有可用堆内存空间
2、在实现 PriorityBlockingQueue 时,内部使用公平锁实现控制线程同步
SynchronousQueue
1、不存储元素的阻塞队列,即单个元素的队列
(1)一种无缓冲的等待队列
(2)相对于有缓冲的 BlockingQueue,缺少缓冲区降低吞吐量,提高及时响应性能
2、声明一个 SynchronousQueue 有两种不同的方式:公平模式、非公平模式
3、公平模式
(1)采用公平锁
(2)配合一个 FIFO 队列,阻塞多余的生产者、消费者
4、非公平模式
(1)默认
(2)采用非公平锁
(3)配合一个 LIFO 队列,管理多余的生产者、消费者
(4)如果生产者、消费者的处理速度有差距,则很容易出现饥渴的情况,即可能有某些生产者,或消费者的数据永远都得不到处理
LinkedTransferQueue
1、由链表组成的无界阻塞队列
2、相对于其他阻塞队列,LinkedTransferQueue 多了 tryTransfer 和 transfer 方法
3、采用一种预占模式
(1)消费者线程取元素时,如果队列不为空,则直接取走数据;若队列为空,则生成一个节点(节点元素为 null)入队,然后消费者线程在该节点上等待
(2)生产者线程入队时,发现有一个元素为 null 的节点,生产者线程就不入队,直接就将元素填充到该节点,并唤醒该节点等待的线程,被唤醒的消费者线程取走元素,从调用的方法返回
LinkedBlockingDeque
1、由链表组成的双向阻塞队列
(1)可以从队列的两端插入、移除元素
(2)对于一些指定操作,在插入、获取队列元素时,如果队列状态不允许该操作,可能会阻塞住该线程,直到队列状态变更为允许操作
2、插入元素时
(1)如果当前队列已满,将会进入阻塞状态
(2)一直等到队列有空的位置时,再插入该元素
(3)该操作可以通过设置超时参数,超时后返回 false,表示操作失败
(4)不设置超时参数,则一直阻塞,中断后抛出 InterruptedException 异常
3、读取元素时
(1)如果当前队列为空,会阻塞线程
(2)直到队列不为空,然后返回元素
(3)同样可以通过设置超时参数
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战