【Interview】深入理解阻塞队列之ArrayBlockingQueue

2024-05-13 07:58

本文主要是介绍【Interview】深入理解阻塞队列之ArrayBlockingQueue,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

  • ArrayBlockingQueue是一个由数组构成的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序,支持公平和非公平模式,默认情况下不保证线程公平的访问队列。新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素
    继承AbstractQueue类,实现BlockingQueue接口

常用方法

  • ArrayBlockingQueue(int capacity) 创建一个固定容量和默认非公司访问策略队列
  • ArrayBlockingQueue(int capacity, boolean fair) 创建一个具有固定容量和指定访问策略的 队列
  • ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c) 创建一个具有固定容量和指定访问策略,并且制定元素类型的 队列
  • boolean add(E e) 插入指定元素到队列尾部,成功返回true,队列已满会直接抛出异常
  • boolean offer(E e) 插入指定元素到队列尾部,成功时返回 true,如果此队列已满,则返回 false
  • E peek() 获取但不移除此队列的头;如果此队列为空,则返回 null
  • E poll() 获取并移除此队列的头,如果此队列为空,则返回 null
  • void put(E e) 将指定的元素插入此队列的尾部,如果该队列已满,则等待可用的空间
  • E take() 获取并移除此队列的头部,在元素变得可用之前一直等待

源码阅读

构造函数

     /** 存放队列的 */final Object[] items;int takeIndex;int putIndex;int count;/** 可重入锁*/final ReentrantLock lock;private final Condition notEmpty;private final Condition notFull;

构造函数

  • ArrayBlockingQueue的公平模式是使用ReentrantLock可重入锁实现的。并使用Condition使用队列的阻塞和唤醒

put入队

  • put操作比较简单。阻塞的添加。首先判断插入元素是否为空,如果是空则抛出控指针
  • 然后获取可重入的排他锁,根据初始化时选择是公平还是非公平模式的锁,加的锁是一个支持可中断的锁。当队列的count等于数组的长度,此时队列已满。则使用await的方法是当前线程进入阻塞模式。未满就执行增加元素,并释放锁。
    put
  • 队列未满,则添加元素到队列尾巴,当++putIndex == items.length条件成立说明此时队列已满,putIndex赋值为0 从头开始。然后累加队列的总个数,并唤醒一个阻塞的线程

队列未满添加元素

take出队

  • 出队的操作也很简单,首先拿到锁,然后判断队列是否为空,为空则进入阻塞等待。不为空则执行dequeue出队,并释放锁。
    出队
    private E dequeue() {//首先获取队列数组final Object[] items = this.items;@SuppressWarnings("unchecked")//拿到出队的元素,临时存储E x = (E) items[takeIndex];//出队的元素置为nullitems[takeIndex] = null;if (++takeIndex == items.length)//当出队元素到队列的最后一个元素,takeIndex还原为0takeIndex = 0;count--;//迭代器操作if (itrs != null)itrs.elementDequeued();//唤醒一个阻塞线程,返回出队的元素notFull.signal();return x;}

这篇关于【Interview】深入理解阻塞队列之ArrayBlockingQueue的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/985125

相关文章

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi