精品成品网站1688品牌营销目标

张小明 2026/3/12 19:18:10
精品成品网站1688,品牌营销目标,网站风格设计要素,好听的房地产公司名字阻塞队列的等待唤醒机制Java阻塞队列的等待唤醒机制详解及自定义实现1. 阻塞队列的基本概念2. ArrayBlockingQueue源码剖析#xff08;等待唤醒机制#xff09;核心字段3. 等待唤醒机制的两种实现方式4. 自定义一个简单阻塞队列5. 常见面试延伸问题总结Java阻塞队列的等待唤醒…阻塞队列的等待唤醒机制Java阻塞队列的等待唤醒机制详解及自定义实现1. 阻塞队列的基本概念2. ArrayBlockingQueue源码剖析等待唤醒机制核心字段3. 等待唤醒机制的两种实现方式4. 自定义一个简单阻塞队列5. 常见面试延伸问题总结Java阻塞队列的等待唤醒机制详解及自定义实现今天来分享一个经典的多线程话题阻塞队列BlockingQueue的等待唤醒机制。在多线程编程中生产者-消费者模式是最常见的场景之一。而阻塞队列正是解决这个模式的核心工具。它能在队列满时阻塞生产者、在队列空时阻塞消费者从而实现线程间安全高效的协作。本文将从以下几个方面进行讲解阻塞队列的基本概念和作用Java并发包中阻塞队列的实现原理以ArrayBlockingQueue为例等待唤醒机制的核心wait()、notify() 与 Lock Condition手把手自定义一个简单阻塞队列常见面试题延伸1. 阻塞队列的基本概念阻塞队列BlockingQueue是java.util.concurrent包下的接口它的典型实现有ArrayBlockingQueue基于数组的有界阻塞队列LinkedBlockingQueue基于链表的有界/无界阻塞队列PriorityBlockingQueue支持优先级的无界阻塞队列SynchronousQueue不存储元素的阻塞队列容量为0阻塞队列的核心操作put(e)向队列尾部添加元素如果队列已满则阻塞当前线程直到有空间take()从队列头部移除元素如果队列为空则阻塞当前线程直到有元素这种“阻塞”行为正是通过等待唤醒机制实现的。2. ArrayBlockingQueue源码剖析等待唤醒机制我们以最常用的ArrayBlockingQueue为例看看它是如何实现阻塞的。核心字段final ReentrantLock lock;// 单一锁控制所有操作privatefinal Condition notEmpty;// 消费者等待条件队列不空privatefinal Condition notFull;// 生产者等待条件队列不满privatefinal Object[]items;// 底层数组int count;// 当前元素数量put操作入队 Javapublicvoidput(Ee)throws InterruptedException{Objects.requireNonNull(e);final ReentrantLock lockthis.lock;lock.lockInterruptibly();try{while(countitems.length){// 队列满时notFull.await();// 阻塞生产者释放锁}enqueue(e);// 实际入队if(countitems.length)// 如果入队后变满无需唤醒生产者return;notEmpty.signal();// 唤醒一个等待的消费者}finally{lock.unlock();}}take操作出队 JavapublicEtake()throws InterruptedException{final ReentrantLock lockthis.lock;lock.lockInterruptibly();try{while(count0){// 队列空时notEmpty.await();// 阻塞消费者释放锁}Eitemdequeue();// 实际出队if(--count0)// 如果出队后变空无需唤醒消费者returnitem;notFull.signal();// 唤醒一个等待的生产者}finally{lock.unlock();}}关键点总结使用单一ReentrantLock保证线程安全通过两个ConditionnotEmpty、notFull精确控制唤醒生产者只唤醒消费者notEmpty.signal()消费者只唤醒生产者notFull.signal()await() 会释放锁让其他线程有机会操作队列signal() 只唤醒一个线程避免惊群效应这比使用synchronized wait/notify更高效、更灵活可以有多个Condition。3. 等待唤醒机制的两种实现方式方式一synchronized wait/notify传统方式wait()当前线程释放锁并进入WAITING状态notify()随机唤醒一个等待线程notifyAll()唤醒所有等待线程容易造成惊群方式二Lock Condition推荐方式condition.await()类似wait()condition.signal()类似notify()condition.signalAll()类似notifyAll()优势一个Lock可以创建多个Condition实现精确唤醒阻塞队列普遍采用第二种方式。4. 自定义一个简单阻塞队列我们来手写一个基于数组的有界阻塞队列使用synchronized wait/notify实现便于理解Javaimportjava.util.concurrent.atomic.AtomicInteger;publicclassMyBlockingQueueE{privatefinal Object[]items;privateint takeIndex;// 消费指针privateint putIndex;// 生产指针privatefinal AtomicInteger countnewAtomicInteger(0);privatefinal int capacity;publicMyBlockingQueue(int capacity){this.capacitycapacity;this.itemsnewObject[capacity];}publicsynchronizedvoidput(Ee)throws InterruptedException{while(count.get()capacity){// 队列满wait();// 释放锁阻塞生产者}items[putIndex]e;if(putIndexcapacity){putIndex0;}count.incrementAndGet();notifyAll();// 唤醒消费者这里用notifyAll避免遗漏}publicsynchronizedEtake()throws InterruptedException{while(count.get()0){// 队列空wait();// 释放锁阻塞消费者}SuppressWarnings(unchecked)Eitem(E)items[takeIndex];items[takeIndex]null;// help GCif(takeIndexcapacity){takeIndex0;}count.decrementAndGet();notifyAll();// 唤醒生产者returnitem;}}测试代码JavapublicclassTest{publicstaticvoidmain(String[]args){MyBlockingQueueIntegerqueuenewMyBlockingQueue(5);// 生产者newThread(()-{for(int i1;i10;i){try{queue.put(i);System.out.println(生产: i);}catch(InterruptedException e){Thread.currentThread().interrupt();}}}).start();// 消费者newThread(()-{for(int i1;i10;i){try{Integer valqueue.take();System.out.println(消费: val);}catch(InterruptedException e){Thread.currentThread().interrupt();}}}).start();}}运行结果会看到生产者和消费者交替进行当队列满/空时自动阻塞。注意实际生产中推荐使用Lock Condition因为notifyAll()可能导致所有线程都被唤醒后再竞争锁性能较低。5. 常见面试延伸问题为什么不直接用notify而是用notifyAll在环形队列中生产者和消费者都在同一个锁上等待使用notify()可能唤醒同类型线程导致继续等待死等。notifyAll()更安全。ArrayBlockingQueue为什么用单一锁而不是读写分离为了实现强一致性入队立即对出队可见且数组实现下读写锁分离收益不大。LinkedBlockingQueue为什么用两把锁链表头尾操作相对独立使用takeLock和putLock分离提高并发度。总结阻塞队列的等待唤醒机制本质是在临界区判断条件不满足时释放锁并等待条件满足后唤醒等待线程。Java并发包通过ReentrantLock Condition实现了高效精确的阻塞队列是我们日常开发中线程安全协作的利器。希望本文对你理解阻塞队列的底层原理有所帮助如果有问题欢迎留言讨论~点赞 收藏 关注三连走一走~
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站专业建设公司网站前置审核申请报告

LVS-DR集群与负载均衡器详解 1. LVS-DR集群服务访问原理 LVS-DR(Linux Virtual Server - Direct Routing)是一种高效的负载均衡技术。在了解如何构建企业级、高可用性的LVS-DR集群之前,我们先来详细探究其转发方法的工作原理。 1.1 客户端访问LVS-DR集群服务的流程 客户端…

张小明 2026/3/5 3:31:00 网站建设

比较好的设计网站推荐创建吃的网站怎么做

建了一个新号:1. 讲职场与第二曲线;2. 聊自己的故事,内心的感悟。谢谢大家,听我的故事。希望对大伙也有帮助。最近做了一个新产品:70天,每天30分钟,短视频行动营(第二曲线最佳选择&a…

张小明 2026/3/5 3:31:01 网站建设

微信如何建立网站网页版qq农场登录入口

EmotiVoice深度解析:为什么它能成为开源语音合成黑马? 在虚拟主播直播中突然“哽咽”,游戏NPC因愤怒而声音颤抖,有声书朗读时随着剧情起伏自然流露悲喜——这些曾属于人类专属的情感表达,正被一款名为 EmotiVoice 的开…

张小明 2026/3/5 3:31:05 网站建设

哪些网站可以做兼职酒店线上推广方案有哪些

高效集成秘籍:LobeChat对接私有化大模型全流程 在企业AI落地的浪潮中,一个现实问题日益凸显:如何在保障数据安全的前提下,让员工真正用上智能助手?许多团队尝试过公有云大模型,却因敏感信息外泄风险被叫停&…

张小明 2026/3/5 3:34:06 网站建设

个人做网站的必要性开发公司名称起名大全

在科技飞速发展的当下,大模型主导的 AI 时代已然来临,如同一场汹涌澎湃的浪潮,席卷了整个软件行业。这一变革性的时代,既带来了前所未有的挑战,也为从业者们开启了全新的机遇之门,而中年程序员这一群体&…

张小明 2026/3/5 3:31:06 网站建设

秦皇岛专业做网站公司组织架构

如何快速配置notepad--:面向新手的完整教程 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- 还在为寻找一款…

张小明 2026/3/5 3:31:07 网站建设