阻塞队列(BlockingQueue)

 当队列是空的,从队列中获取元素的操作将会被阻塞

当队列是满的,从队列中添加元素的操作将会被阻塞
 
常用的队列主要有以下两种:
先进先出(FIFO):先插入的队列的元素也最先出队列,类似于排队的功能。
从某种程度上来说这种队列也体现了一种公平性
后进先出(LIFO):后插入队列的元素最先出队列,这种队列优先处理最近发
生的事件(栈)
BlockingQueue 核心方法

常见的 BlockingQueue
ArrayBlockingQueue(常用): 由数组结构组成的有界阻塞队列
基于数组的阻塞队列实现,在 ArrayBlockingQueue 内部,维护了一个定长数
组,以便缓存队列中的数据对象,这是一个常用的阻塞队列,除了一个定长数
组外,ArrayBlockingQueue 内部还保存着两个整形变量,分别标识着队列的
头部和尾部在数组中的位置。
ArrayBlockingQueue 在生产者放入数据和消费者获取数据,都是共用同一个
锁对象,由此也意味着两者无法真正并行运行,这点尤其不同于
LinkedBlockingQueue;按照实现原理来分析,ArrayBlockingQueue 完全可
以采用分离锁,从而实现生产者和消费者操作的完全并行运行。Doug Lea 之
所以没这样去做,也许是因为 ArrayBlockingQueue 的数据写入和获取操作已
经足够轻巧,以至于引入独立的锁机制,除了给代码带来额外的复杂性外,其
在性能上完全占不到任何便宜。 ArrayBlockingQueue 和
LinkedBlockingQueue 间还有一个明显的不同之处在于,前者在插入或删除
元素时不会产生或销毁任何额外的对象实例,而后者则会生成一个额外的
Node 对象。这在长时间内需要高效并发地处理大批量数据的系统中,其对于
GC 的影响还是存在一定的区别。而在创建 ArrayBlockingQueue 时,我们还
可以控制对象的内部锁是否采用公平锁,默认采用非公平锁。
LinkedBlockingQueue(常用): 由链表结构组成的有界(但大小默认值为
integer.MAX_VALUE)阻塞队列
基于链表的阻塞队列,同 ArrayListBlockingQueue 类似,其内部也维持着一
个数据缓冲队列(该队列由一个链表构成),当生产者往队列中放入一个数据
时,队列会从生产者手中获取数据,并缓存在队列内部,而生产者立即返回;
只有当队列缓冲区达到最大值缓存容量时(LinkedBlockingQueue 可以通过
构造函数指定该值),才会阻塞生产者队列,直到消费者从队列中消费掉一份
数据,生产者线程会被唤醒,反之对于消费者这端的处理也基于同样的原理。
而 LinkedBlockingQueue 之所以能够高效的处理并发数据,还因为其对于生
产者端和消费者端分别采用了独立的锁来控制数据同步,这也意味着在高并发
的情况下生产者和消费者可以并行地操作队列中的数据,以此来提高整个队列
的并发性能。
ArrayBlockingQueue 和 LinkedBlockingQueue 是两个最普通也是最常用
的阻塞队列,一般情况下,在处理多线程间的生产者消费者问题,使用这两个
类足以。
例子:
//创建阻塞队列
BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值