怎么做好网站推广如何学做网站外包

张小明 2026/1/16 2:39:11
怎么做好网站推广,如何学做网站外包,自有品牌如何推广,建设网站的企业排行从synchronized到LockCondition前言1. 先说传统方式#xff1a;synchronized wait/notify2. 重头戏#xff1a;Lock Condition#xff08;强烈推荐#xff01;#xff09;为什么推荐它#xff1f;核心组件#xff1a;关键规则#xff1a;为什么能精确唤醒#xff1f…从synchronized到LockCondition前言1. 先说传统方式synchronized wait/notify2. 重头戏Lock Condition强烈推荐为什么推荐它核心组件关键规则为什么能精确唤醒在实际项目中的应用阻塞队列3. 两种方式对比总结结论新项目直接用Lock Condition老方式只用来理解历史。前言今天来聊聊Java多线程里一个超级经典的话题——等待唤醒机制。在多线程编程里我们经常遇到“线程协作”的场景比如一个线程生产数据另一个线程消费数据或者两个线程需要严格交替执行像乒乓球一样你一下我一下。这时候就需要“等待唤醒”条件不满足时线程自己睡一觉等条件好了再被叫醒继续干活。Java提供了两种实现方式老派synchronized wait()/notify()新派推荐Lock Condition今天重点讲Lock Condition因为它更灵活、更高效是现代并发编程的主流Java并发包里的阻塞队列都是用这个实现的。我们会用一个简单例子——两个线程交替打印0~9——来一步步讲解。1. 先说传统方式synchronized wait/notify这是JDK 1.0就有的方式简单但有局限。核心规则必须在synchronized同步块里调用wait()/notify()。wait()当前线程释放锁进入等待状态睡大觉。notify()随机唤醒一个等待线程。notifyAll()唤醒所有等待线程生产者消费者场景通常用这个避免“假死”。必须用while检查条件重要防止伪唤醒。简单例子交替打印publicclassSyncWaitNotifyDemo{privatestaticfinal Object locknewObject();// 共享锁对象privatestaticint num0;privatestaticboolean isATurntrue;// true: A的回合publicstaticvoidmain(String[]args){newThread(()-{while(num10){synchronized(lock){while(!isATurn){// 用while防伪唤醒try{lock.wait();// 不是我的回合释放锁等待}catch(InterruptedException e){e.printStackTrace();}}System.out.println(A打印: num);isATurnfalse;lock.notifyAll();// 唤醒所有安全}}},A).start();newThread(()-{while(num10){synchronized(lock){while(isATurn){try{lock.wait();}catch(InterruptedException e){e.printStackTrace();}}System.out.println(B打印: num);isATurntrue;lock.notifyAll();}}},B).start();}}它能工作但缺点明显只有一个等待队列所有线程混在一起。notifyAll()会把所有线程都唤醒即使不需要醒来后又发现条件不满足再wait——浪费性能叫“惊群效应”。不支持超时、精确唤醒等高级功能。2. 重头戏Lock Condition强烈推荐从JDK 1.5开始JUC包java.util.concurrent引入了ReentrantLock和Condition彻底升级了等待唤醒机制。为什么推荐它精确唤醒一个Lock可以创建多个Condition每个Condition有独立的等待队列。你可以“只唤醒消费者”或“只唤醒生产者”不浪费。功能更强支持超时等待awaitNanos、不可中断等待等。性能更好避免惊群高并发下更快。灵活公平锁可选避免线程饥饿。核心组件ReentrantLock lock new ReentrantLock();可重入锁手动加锁解锁。Condition cond lock.newCondition();可以创建多个每个是一个独立等待队列。cond.await()释放锁当前线程进入该Condition的等待队列睡大觉。cond.signal()只唤醒该队列的一个线程。cond.signalAll()唤醒该队列的所有线程。关键规则必须先lock.lock()获取锁再操作Condition。unlock()一定要放finally里防止死锁。永远用while检查条件防伪唤醒。完整例子交替打印0~9带详细注释Javaimport java.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassLockConditionDemo{privatestaticfinal Lock locknewReentrantLock();// 一把可重入锁所有线程共享privatestaticfinal Condition condAlock.newCondition();// A线程专属等待队列约定privatestaticfinal Condition condBlock.newCondition();// B线程专属等待队列约定privatestaticint num0;// 当前数字privatestaticboolean isATurntrue;// true: 轮到A初始让A先publicstaticvoidmain(String[]args){// A线程打印偶数newThread(()-{while(num10){// 直到打印完9lock.lock();// 1. 先拿锁try{while(!isATurn){// 2. 用while检查不是我的回合就等condA.await();// 释放锁当前线程A进入condA队列睡觉}// 到这说明轮到我了且重新拿到了锁System.out.println(A打印: num);num;isATurnfalse;// 交给BcondB.signal();// 精确唤醒B只从condB队列拿一个}catch(InterruptedException e){e.printStackTrace();}finally{lock.unlock();// 3. 一定释放锁}}},A).start();// B线程打印奇数newThread(()-{while(num10){lock.lock();try{while(isATurn){// 不是我的回合就等condB.await();// B线程进入condB队列}System.out.println(B打印: num);num;isATurntrue;condA.signal();// 精确唤醒A}catch(InterruptedException e){e.printStackTrace();}finally{lock.unlock();}}},B).start();}}运行结果完美交替textA打印: 0B打印: 1A打印: 2B打印: 3…B打印: 9为什么能精确唤醒不是Condition“认人”而是我们约定A只在condA等B只在condB等。signal()只去对应队列叫醒人不会吵醒另一边。在实际项目中的应用阻塞队列Java的ArrayBlockingQueue就是用一个Lock 两个Condition实现的notEmpty所有消费者共享的等待队列队列空时await。notFull所有生产者共享的等待队列队列满时await。生产后notEmpty.signal()只唤醒一个消费者。消费后notFull.signal()只唤醒一个生产者。多生产者/多消费者时它们共享同一个Condition队列signal()只唤醒一个就够了——超级高效3. 两种方式对比总结特性synchronized wait/notifyLock Condition等待队列只有一个所有线程混一起可以多个独立队列精确唤醒唤醒方式notify随机常用notifyAll惊群signal精确只唤醒需要的功能基础支持超时、中断、公平锁等性能一般高并发下更好使用难度简单自动加解锁稍复杂手动unlock推荐场景简单同步生产者消费者、阻塞队列、高并发结论新项目直接用Lock Condition老方式只用来理解历史。希望这篇文章让你对等待唤醒机制不再迷糊如果你有疑问或者想看生产者消费者的完整代码欢迎留言讨论点赞 收藏 关注三连支持一下呗
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

企业网站内容更新网站 推送

第一章:量子算法的 VSCode 文档注释在开发量子计算相关应用时,代码可读性与团队协作效率至关重要。使用 Visual Studio Code(VSCode)编写量子算法时,通过规范的文档注释可以显著提升代码维护性。TypeScript 或 Python …

张小明 2026/1/14 4:33:18 网站建设

怎么用模板建站开电商有哪些步骤

在数字阅读时代,如何高效管理读书笔记成为众多读者的痛点。Obsidian Weread Plugin作为一款创新的社区插件,完美解决了微信读书用户与Obsidian知识管理系统的集成问题,让知识沉淀变得更加自动化、系统化。🚀 【免费下载链接】obsi…

张小明 2026/1/14 3:06:01 网站建设

diango做的网站怎么用建工网校论坛

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

张小明 2026/1/14 4:51:51 网站建设

网站如何添加认证联盟网页设计框架结构

归并排序定义:最开始的每个元素单独作为一个子序列,每轮对相邻的子序列两两归并直到归并成一个序列//归并排序的核心思想是将一个大问题分解成若干个小问题,分别解决这些小问题,然后将结果合并起来,最终得到整个问题的…

张小明 2026/1/14 6:19:28 网站建设

做产品网站要备案吗网站被301跳转

3步掌握n8n浏览器自动化:零基础搭建Puppeteer工作流 【免费下载链接】n8n-nodes-puppeteer n8n node for requesting webpages using Puppeteer 项目地址: https://gitcode.com/gh_mirrors/n8/n8n-nodes-puppeteer 想要实现网页自动化操作却担心编程门槛太高…

张小明 2026/1/14 6:56:30 网站建设

crm网站电子商务网站开发报价

COMSOL水平集方法对激光焊接过程中熔池特征进行仿真分析,详细展示了激光焊接过程中熔池内部温度场、流场以及蒸汽反冲现象 有参考文献,源文件,结果云图等车间里激光焊接的火花四溅,金属表面瞬间熔化的场景总让人联想到科幻片。但你…

张小明 2026/1/14 8:07:09 网站建设