ArrayBlockingQueue原理

简介: 文章主要介绍了ArrayBlockingQueue的工作原理。ArrayBlockingQueue通过ReentrantLock和Condition实现了高效的阻塞队列,能够有效地避免CPU资源浪费。它非常适合用于生产者-消费者模型的应用场景,特别是需要控制生产者和消费者线程同步的场合。

阻塞队列ArrayBlockingQueue是对生产者消费者模型的实现,可以实现生产者和消费者通信。

在队列空的时候,消费者线程可以阻塞,不为空被唤醒。

在队列满的时候,生产者线程阻塞功能。不满的时候被唤醒。

ArrayBlockingQueue底层使用了独占锁ReentrantLock,和两个Conditon条件实现生产者和消费者互斥。 下面将通过查看ArrayBlockingQueue源码来了解实现细节。

依赖的锁:

    /** Main lock guarding all access */    final ReentrantLock lock;    /** Condition for waiting takes */    private final Condition notEmpty;​    /** Condition for waiting puts */    private final Condition notFull;

put方法:

//如果队列满了,会等待notFullpublic void put(E e) throws InterruptedException {
           checkNotNull(e);        //入队修改先获取锁        final ReentrantLock lock = this.lock;        lock.lockInterruptibly();        try {
               while (count == items.length)                notFull.await();            enqueue(e);        } finally {
               lock.unlock();        }    }    //数据成功入队列后,通知notEmpty条件,阻塞了的消费者线程可以继续消费private void enqueue(E x) {
           // assert lock.getHoldCount() == 1;        // assert items[putIndex] == null;        final Object[] items = this.items;        items[putIndex] = x;        if (++putIndex == items.length)            putIndex = 0;        count++;        notEmpty.signal();    }

put方法在队列满的情况下会进入等待状态,会等到take线程唤醒。

take方法:

//如果队列为空,notEmpty条件等待。public E take() throws InterruptedException {        //出队先获取锁        final ReentrantLock lock = this.lock;        lock.lockInterruptibly();        try {            while (count == 0)                notEmpty.await();            return dequeue();        } finally {            lock.unlock();        }    }    //获取元素,获取后,通知notFull条件private E dequeue() {        // assert lock.getHoldCount() == 1;        // assert items[takeIndex] != null;        final Object[] items = this.items;        @SuppressWarnings("unchecked")        E x = (E) items[takeIndex];        items[takeIndex] = null;        if (++takeIndex == items.length)            takeIndex = 0;        count--;        if (itrs != null)            itrs.elementDequeued();        notFull.signal();        return x;}

总结:

ArrayBlockingQueue是对生产者消费者模型的实现,并借助ReentrantLock实现了阻塞功能,通过阻塞来避免cpu资源滥用。

相关文章
|
缓存 监控 druid
万字长文,带你快速上手这些池化技术!| Java 开发实战
池化技术 小伙伴们好久不见呀~ 😝 额 转眼就到了 儿童节 啦 哈哈哈 祝各位大小朋友节日快乐! 轻轻松松过节,开开心心玩耍,老顽童也不错呀😝 哈哈哈 (不忘童真!) 嘿嘿 迎来了自己的第一篇 万字长文! 😝 (中间除了看看金色的雨外,还在做其他笔记~ 所以就拖到现在了 ,,ԾㅂԾ,, 这篇长文除了详细介绍线程池这个点以及它的使用场景外,还分享了下几种连接池滴用法以及避开一些坑🕳,(图还挺多的~) 希望对你有所帮助!!冲冲冲!😋 池化技术~,不知道小伙伴们对这个词是怎么理解的? 为什么要有这个技术呢?解决什么 痛点 呢?哈哈哈 带着小小的思考和 4ye 一起往下看看叭~ 池化
789 0
|
存储 人工智能 前端开发
搭建企业内部的大语言模型系统
该内容主要介绍了开源大语言模型及其管理方法。首先对比了商业大模型(如ChatGPT)与支持私有部署的开源大模型(如Mistral、Meta Llama),强调了开源模型在安全和隐私方面的优势。接着详细列出了多种大语言模型管理工具,如HuggingFace、Ollama等,并展示了Ollama的快速部署和使用方法。此外,还介绍了大语言模型的应用前端,包括开源平台Ollama-chatbot、PrivateGPT等,以及它们的具体部署步骤和配置示例。最后提供了非私有OpenAI-powered部署方案及其API调用示例。
|
消息中间件 存储 运维
RabbitMQ插件详解:rabbitmq_message_timestamp【Rabbitmq 五】
RabbitMQ插件详解:rabbitmq_message_timestamp【Rabbitmq 五】
273 1
|
6月前
|
缓存 NoSQL 测试技术
Redis压测脚本及持久化机制
Redis压测脚本及持久化机制简介: Redis性能压测通过`redis-benchmark`工具进行,可评估读写性能。持久化机制包括无持久化、RDB(定期快照)和AOF(操作日志),以及两者的结合。RDB适合快速备份与恢复,但可能丢失数据;AOF更安全,记录每次写操作,适合高数据安全性需求。两者结合能兼顾性能与安全性,建议同时开启并定期备份RDB文件以确保数据安全。
142 9
|
9月前
|
设计模式 前端开发 JavaScript
前端必须掌握的设计模式——装饰器模式
装饰器模式是一种结构型设计模式,通过创建新类来包装原始对象,实现在不修改原有结构的前提下扩展新行为。其核心在于“组合”思想,使新功能可“即插即拔”。该模式具有解耦性、灵活性和动态性等特点,广泛应用于类的面向对象编程语言中,如JavaScript的注解和TypeScript的写法。示例中,通过装饰器模式为游戏角色动态添加装备,展示了其强大的扩展性和灵活性。
170 16
|
11月前
|
SQL Oracle 关系型数据库
安装最新 MySQL 8.0 数据库(教学用)
安装最新 MySQL 8.0 数据库(教学用)
532 4
|
11月前
|
人工智能 Serverless API
云原生应用开发平台CAP:一站式应用开发及生命周期管理解决方案
阿里云的云应用开发平台CAP(Cloud Application Platform)是一款一站式应用开发及应用生命周期管理平台。它提供丰富的Serverless与AI应用模板、高效的开发者工具链及企业级应用管理功能,帮助开发者快速构建、部署和管理云上应用,大幅提升研发、部署和运维效能。
838 3
|
11月前
|
运维 监控 API
深入了解微服务架构:优势与挑战
【10月更文挑战第7天】深入了解微服务架构:优势与挑战
|
算法 计算机视觉
非极大值抑制详细原理(NMS含代码及详细注释)
非极大值抑制(Non-Maximum Suppression,NMS)详细原理(含代码及详细注释)
2305 1
非极大值抑制详细原理(NMS含代码及详细注释)
|
云安全 监控 安全
【Aquasec翻译计划】什么是应用安全姿态管理(ASPM)
【Aquasec翻译计划】什么是应用安全姿态管理(ASPM)
879 2