哪个网站做衣服的阿里巴巴国际站做2个网站有用吗

张小明 2026/3/12 20:42:52
哪个网站做衣服的,阿里巴巴国际站做2个网站有用吗,腾讯企业邮箱域名续费,建网站赚钱吗阻塞队列的等待唤醒机制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进行投诉反馈,一经查实,立即删除!

网站建设公司长沙国家企业信息网官网

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个智能客服系统工作流:1. 用户上传产品文档或FAQ作为知识库 2. AI自动提取关键信息构建知识图谱 3. 生成基于NLP的意图识别模块 4. 创建多轮对话管理逻辑 5. 输出…

张小明 2026/3/5 3:11:43 网站建设

精美网站制作公司ppt电子商务网站建设

ComfyUI版本兼容性问题应对策略:避免工作流失效 在AI图像生成领域,稳定性常常被低估,直到某天你满怀期待地打开一个曾完美运行的工作流,却发现满屏红色报错——节点找不到、参数错乱、连接断裂。这种“明明昨天还好好的”崩溃体验…

张小明 2026/3/5 3:11:45 网站建设

苏宁网站开发人员工资建设个人网站的要求

在深度学习模型日益庞大的今天,如何利用有限的算力资源加速训练并降低显存占用,是每位开发者必须面对的挑战。华为昇腾(Ascend)系列AI处理器(如Ascend 910)在设计之初就对半精度浮点数(FP16&…

张小明 2026/3/5 3:11:45 网站建设

电子商务型网站沭阳网站建设shy1z

1、ITK库概述ITK (Insight Segmentation and Registration Toolkit) 是一个开源的跨平台软件开发工具包,主要用于图像处理,特别是生物医学图像处理领域。该工具包提供了一套丰富的图像处理算法,特别是在图像分割和配准方面具有强大的功能。IT…

张小明 2026/3/5 3:11:46 网站建设

河间米各庄网站建设制作怎么做企业的网站首页

简介IBM SPSS Statistics 27 相较上一版本,该软件不仅将两项实用功能整合至基础模块,还新增多项统计分析能力,同时优化操作体验与兼容性,大幅提升数据分析的效率与实用性,可满足科研、市场调研等多领域的数据处理需求。…

张小明 2026/3/5 3:11:47 网站建设

vivo手机为什么建设网站wordpress标签库

第一章:VSCode量子硬件的更新机制VSCode 作为现代开发者的首选编辑器,其在量子计算领域的扩展支持日益完善。随着量子硬件模拟与编程框架(如 Q#、Cirq、Qiskit)的发展,VSCode 插件生态也引入了针对量子设备状态同步和固…

张小明 2026/3/5 3:11:47 网站建设