阻塞队列

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)同样可以通过设置超时参数

posted @   半条咸鱼  阅读(37)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示