外国人在中国做视频网站深圳网站建设专业公司

张小明 2026/1/13 8:37:37
外国人在中国做视频网站,深圳网站建设专业公司,适合小企业的erp软件,开发公司与物业公司交接明细阻塞队列的等待唤醒机制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进行投诉反馈,一经查实,立即删除!

sever2012做网站广告公司接单软件

构建可扩展的大数据领域数据架构:从“数据泥潭”到“数据高速公路”的进化指南关键词:大数据架构、可扩展性设计、数据湖、数据仓库、湖仓一体、分层架构、分布式计算摘要:在数据量以“泽字节(ZB)”为单位激增的今天&a…

张小明 2026/1/9 22:32:55 网站建设

百姓网招聘最新招聘信息杭州网站seo外包

VxeTable 驱动的 Sonic 数字人任务调度系统设计与实践 在短视频、在线教育和电商直播等场景中,虚拟数字人正从“炫技”走向“实用”。越来越多的内容创作者不再满足于简单的语音播报式 AI 角色,而是希望快速生成具有自然唇形同步、表情生动的动态说话视频…

张小明 2026/1/9 23:59:19 网站建设

公司网站实用性如何做网站连接

第一章:AI自动化新纪元的开启人工智能正以前所未有的速度重塑软件开发、运维与业务流程的底层逻辑。从智能代码补全到全自动部署流水线,AI不再仅仅是辅助工具,而是逐步成为系统架构中的核心决策组件。这一转变标志着我们正式迈入AI驱动的自动…

张小明 2026/1/9 10:33:11 网站建设

网站备案 电信网络推广策划方案范文

第一章:农业传感器 PHP 数据的存储优化在现代农业系统中,传感器持续采集土壤湿度、温度、光照强度等关键数据,并通过PHP后端服务进行接收与存储。随着数据量增长,传统直接写入数据库的方式容易导致性能瓶颈。因此,优化…

张小明 2026/1/10 1:48:14 网站建设

做信息图的免费网站网站建设要写代码吗

LangFlow:如何用可视化方式低成本调用大模型 在今天,越来越多开发者希望快速构建基于大语言模型(LLM)的智能应用——比如自动客服、知识库问答、内容生成工具。但现实往往很骨感:写一堆代码、调试半天还不知道哪一步出…

张小明 2026/1/11 7:41:52 网站建设

diy科技制作网站wordpress首页分页代码

TensorFlow在智能家居控制中的应用场景 在现代家庭中,智能设备早已不再只是简单的远程开关。从能识别人脸的门铃,到会“听懂”指令的音箱;从自动调节温度的空调,到夜间监测老人活动的安全系统——这些背后都离不开一个核心能力&am…

张小明 2026/1/10 17:06:55 网站建设