Java ---- 阻塞队列 Blocking Queue

阻塞队列(Blocking Queue)是一种特殊类型的队列,用于多线程环境中,实现进程通信;

常见的Java阻塞队列包括:

(1)ArrayBlockingQueue(有界队列)

  内部是采用数组存储元素的,初始化需要指定容器大小,ArrayBlockingQueue可以用于实现数据缓存、限流、生产者 - 消费者模式等各种应用。在队列的基础上,提供了阻塞添加获取元素的能力;循环数组,双指针的形式;插入和删除的时间复杂度都是O(1);

  原理:

  1)采用Lock锁的Condition通知机制来进行阻塞控制的;

  2)利用独占锁 ReentrantLock 实现线程安全;

(2)LinkedBlockingQueue(无界队列)

  采用基于链表实现的阻塞队列;默认情况下,阻塞队列的大小,数值特别大,所以被称为无界的队列;内部是由单向链表实现的,采用锁分离技术实现入队出队互不阻塞。添加元素和获取元素都有独立的锁;

  QS:线程池中为什么使用LinkedBlockingQueue而不用ArrayBlockingQueue?
  因为LinkedBlockingQueue的入队和出队是两把锁,存取元素互不干扰。ArrayBlockingQueue则是使用的同一把锁,存取元素时相互排斥。LinkedBlockingQueue这种锁分离的方式可以有效地减少锁竞争,从而提高线程池的并发性能。

(3)PriorityBlockingQueue(FIFO队列)

阻塞队列的特点:

(1)当队列为空时,从队列中获取元素的操作会被阻塞;直到队列中,有新的元素可用;

(2)当队列已满时,向队列中添加元素的操作会被阻塞,直到队列中有空位置可以用,

 常见应用场景:

(1)生产者消费者模型;

(2)线程池的任务队列;

(3)同步队列;多个线程同步一个元素;

posted @   我太想努力了  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示