福建建设执业中心网站把插钉机子拍下怎么做网站
2026/1/12 16:20:34 网站建设 项目流程
福建建设执业中心网站,把插钉机子拍下怎么做网站,wordpress 添加文章属性,网站编辑属于什么行业阻塞队列的等待唤醒机制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实现了高效精确的阻塞队列是我们日常开发中线程安全协作的利器。希望本文对你理解阻塞队列的底层原理有所帮助如果有问题欢迎留言讨论~点赞 收藏 关注三连走一走~

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询