活动策划公司网站麻将网站怎么做的

张小明 2026/1/2 11:53:13
活动策划公司网站,麻将网站怎么做的,贵阳网站建设是什么意思,橡胶东莞网站建设技术支持文章目录一、什么是死锁#xff1f;一个生动的比喻二、死锁产生的四个必要条件1. 互斥条件#xff08;Mutual Exclusion#xff09;2. 请求与保持条件#xff08;Hold and Wait#xff09;3. 不剥夺条件#xff08;No Preemption#xff09;4. 循环等待条件#xff08;…文章目录一、什么是死锁一个生动的比喻二、死锁产生的四个必要条件1. 互斥条件Mutual Exclusion2. 请求与保持条件Hold and Wait3. 不剥夺条件No Preemption4. 循环等待条件Circular Wait三、死锁的实战场景分析场景一数据库转账经典死锁场景二MySQL间隙锁死锁场景三C#异步编程中的死锁四、如何避免和解决死锁1. 破坏请求与保持条件一次性申请所有资源2. 破坏不可剥夺条件使用定时锁3. 破坏循环等待条件资源有序分配法4. 数据库层面的死锁避免策略五、死锁检测与排查MySQL死锁检测Java死锁检测六、总结参考文章大家好我是你们的技术老友科威舟今天给大家分享一下常用Java中的死锁。当我们谈死锁时其实就像两个绅士在门口互相让路都让对方先走结果谁都走不了作为一名后端开发者死锁这个问题就像是一场恶梦。不管你是刚入门的新手还是经验丰富的老兵都可能在某个深夜被这个看似简单却又棘手的问题折磨得死去活来。今天就让我们一起来深入剖析死锁看看它到底是如何产生的以及如何优雅地避免它。一、什么是死锁一个生动的比喻想象一下账户A需要向账户B转账同时账户B也需要向账户A转账。两个转账操作都需要锁定两个账户的余额才能进行。这时账户A先锁定了自己然后尝试锁定账户B同时账户B也锁定了自己并尝试锁定账户A。结果就是账户A等着账户B释放锁账户B也等着账户A释放锁——双方陷入了永恒的等待这就是死锁。用更专业的术语来说死锁就是两个或两个以上的线程在执行过程中因争夺资源而造成的一种互相等待的现象若无外力作用它们都将无法推进下去。二、死锁产生的四个必要条件死锁的发生必须同时满足以下四个条件缺一不可1. 互斥条件Mutual Exclusion共享资源每次只能被一个线程使用。就像厕所只有一个坑位一次只能容纳一个人。2. 请求与保持条件Hold and Wait一个线程因请求资源而阻塞时对已获得的资源保持不放。这就像你一手拿着筷子一手拿着碗却还想要别人的勺子。3. 不剥夺条件No Preemption线程已获得的资源在未使用完之前不能被其他线程强行剥夺。这就像你不能从别人嘴里抢走食物一样。4. 循环等待条件Circular Wait若干线程之间形成一种头尾相接的循环等待资源关系。就像A等BB等CC又在等A形成一个闭环。只要破坏这四个条件中的任意一个死锁就不会发生。这是我们避免死锁的理论基础。三、死锁的实战场景分析场景一数据库转账经典死锁这是最常见的死锁场景两个事务以不同顺序更新相同的记录-- 事务ABEGIN;UPDATEaccountSETbalancebalance-100WHEREid1;UPDATEaccountSETbalancebalance100WHEREid2;COMMIT;-- 事务BBEGIN;UPDATEaccountSETbalancebalance-100WHEREid2;UPDATEaccountSETbalancebalance100WHEREid1;COMMIT;如果事务A执行完第一句事务B也同时执行完第一句那么事务A会等待事务B释放id2的锁而事务B也会等待事务A释放id1的锁形成死锁。场景二MySQL间隙锁死锁在REPEATABLE READ隔离级别下MySQL会使用间隙锁来防止幻读这也可能导致死锁。假设有一个用户积分表现有数据为id1user_id1id3user_id3id5user_id5。注意user_id为2和4的记录不存在。事务A执行SELECT*FROMuser_pointsWHEREuser_id2FORUPDATE;-- 获取间隙锁(1,3)INSERTINTOuser_points(user_id,points)VALUES(2,100);-- 等待事务B事务B执行SELECT*FROMuser_pointsWHEREuser_id4FORUPDATE;-- 获取间隙锁(3,5)INSERTINTOuser_points(user_id,points)VALUES(4,100);-- 等待事务A这就形成了死锁因为每个事务都持有一个间隙锁并等待对方释放锁。场景三C#异步编程中的死锁在UI程序中如果在UI线程中调用Task.Run并在其中使用.Result等待异步操作很容易导致死锁// UI线程代码privatevoidbtnDeadlock_Click(objectsender,EventArgse){varresultTask.Run((){returnDoSomethingAsync().Result;// ❌ 危险操作}).Result;MessageBox.Show(result);// 这里永远卡住}privateasyncTaskstringDoSomethingAsync(){awaitTask.Delay(1000);return完成;}这里的问题是Task.Run在线程池线程执行DoSomethingAsync()DoSomethingAsync()内部的await尝试返回到原始上下文UI线程但UI线程正在等待Task.Run完成导致死锁。四、如何避免和解决死锁1. 破坏请求与保持条件一次性申请所有资源我们可以设计一个资源分配器确保线程一次性申请所有需要的资源如果无法满足就等待。publicclassAllocator{privateListObjectalsnewArrayList();synchronizedbooleanapply(Objectfrom,Objectto){if(als.contains(from)||als.contains(to)){returnfalse;}else{als.add(from);als.add(to);}returntrue;}synchronizedvoidfree(Objectfrom,Objectto){als.remove(from);als.remove(to);}}// 使用方式voidtransfer(Accounttarget,intamt){while(!actr.apply(this,target)){// 循环等待直到成功申请到资源}try{// 执行转账操作synchronized(this){synchronized(target){// 业务逻辑}}}finally{actr.free(this,target);}}2. 破坏不可剥夺条件使用定时锁使用Lock类中的tryLock方法指定一个超时时限在等待超过该时间后返回失败信息。publicclassDeadLockSolution{publicstaticReentrantLocklock1newReentrantLock();publicstaticReentrantLocklock2newReentrantLock();publicstaticvoidmain(String[]args){Threadthread1newThread(()-{while(true){if(lock1.tryLock(1,TimeUnit.MILLISECONDS)){try{if(lock2.tryLock(1,TimeUnit.MILLISECONDS)){try{System.out.println(Thread1获取了两把锁);return;}finally{lock2.unlock();}}}finally{lock1.unlock();}}}});}}3. 破坏循环等待条件资源有序分配法对资源进行排序要求线程按照一定的顺序申请资源。classAccount{privateintid;privateintbalance;voidtransfer(Accounttarget,intamt){Accountleftthis;Accountrighttarget;// 按照id大小确定资源申请顺序if(this.idtarget.id){lefttarget;rightthis;}synchronized(left){synchronized(right){if(this.balanceamt){this.balance-amt;target.balanceamt;}}}}}4. 数据库层面的死锁避免策略固定顺序访问确保所有事务按相同的顺序访问记录。-- 事务A和事务B都按照id递增顺序更新UPDATEaccountSETbalancebalance-100WHEREidIN(1,2)ORDERBYid;减小事务范围不要在一个大事务中做太多事情拆分为多个小事务。设置锁等待超时通过参数控制锁等待时间。SETinnodb_lock_wait_timeout10;-- 设置10秒超时降低隔离级别在业务允许的情况下考虑使用READ COMMITTED来减少锁冲突。五、死锁检测与排查当系统出现死锁时我们需要工具来检测和排查。MySQL死锁检测MySQL可以自动检测死锁并回滚其中一个事务使用SHOW ENGINE INNODB STATUS可以查看最近一次死锁的详情。Java死锁检测可以使用jvisualvm或jstack等工具检测Java程序中的死锁。jstackpid工具会显示线程状态和锁信息帮助定位死锁发生的具体位置。六、总结死锁是并发编程中常见但又棘手的问题。通过今天的探讨我们了解了死锁产生的四个必要条件以及多种预防和避免死锁的策略。关键在于破坏死锁产生的四个条件中的至少一个。在实际开发中我建议统一资源访问顺序这是最简单有效的方法使用超时机制避免无限期等待保持事务简洁尽快释放锁合理使用索引减少锁定的范围死锁就像编程道路上的绊脚石但只要我们掌握了正确的方法就能轻松跨越。希望这篇文章能帮助你在今后的开发工作中更好地预防和解决死锁问题参考文章http://mp.weixin.qq.com/s?__bizMzk0MzIyMDA1OAmid2247495931idx3snb934ab8d68d115aabffbcd4c64929b53chksmc2f967ec4b3413cd5ef4ae577377f0cf2e1efaf4fa6ccd1689d0f2fa52a197f290e8cd6dd625#rdhttps://blog.csdn.net/HD_Cash/article/details/123964549https://blog.csdn.net/nwbfygsjdr/article/details/140032712http://m.blog.csdn.net/Swartz2015/article/details/64638357https://blog.csdn.net/weixin_45372436/article/details/101637289https://segmentfault.com/a/1190000046455928?sortvoteshttps://segmentfault.com/a/1190000037512913?sortnewesthttp://mp.weixin.qq.com/s?__bizMzIwMTgyNDU0Ngmid2247486459idx1sn0e0fe8eae405c2631b16e56308b6be2cchksm975b62f6fcd970ce187520922b77dd11566240387c08cba371535af7facdee994cae8976b6f3#rdhttps://blog.csdn.net/z_344791576/article/details/148050684你是怎么解决死锁问题的呢欢迎在评论区分享你的经验和困惑更多技术干货欢迎关注微信公众号科威舟的AI笔记~【转载须知】转载请注明原文出处及作者信息
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

个人网站备案说明周到的做pc端网站

YOLOv8n-face人脸检测实战指南:从入门到精通 【免费下载链接】yolov8-face 项目地址: https://gitcode.com/gh_mirrors/yo/yolov8-face 为什么选择YOLOv8n-face? 还在为传统人脸检测模型的复杂部署而烦恼吗?YOLOv8n-face用极简的设计…

张小明 2025/12/29 8:00:49 网站建设

息烽县住房和城乡建设局网站网页广告费一般多少钱

探索网络空间中的性少数群体体验 在当今数字化时代,网络空间为人们提供了全新的交流和互动方式。我们常常会思考,当我们身处网络时,身体与自我的概念会发生怎样的变化?而对于性少数群体来说,网络又为他们带来了怎样独特的体验呢? 重新审视网络中的身体与自我 传统观念…

张小明 2025/12/29 8:00:55 网站建设

网站搭建技术都有啥高端网站报价

Korn Shell编程全面指南 1. Korn Shell基础介绍 Korn Shell(ksh)是由贝尔实验室的David Korn创建的命令和脚本语言。它具有众多实用的特性,以下为你详细介绍: - 命令行编辑 :支持类似于Unix编辑器vi和emacs的命令行编辑功能,让用户可以方便地修改输入的命令。 - 文…

张小明 2025/12/31 2:56:16 网站建设

建自己的o2o网站要多少钱wordpress数据库压力

LangFlow变量传递机制深入剖析 在构建AI驱动的应用时,一个常见的挑战是:如何让非程序员也能参与设计复杂的语言模型流程?传统方式要求开发者熟练掌握LangChain的API、处理繁琐的变量绑定和依赖管理,这不仅耗时,还容易出…

张小明 2025/12/30 12:41:06 网站建设

长安网站建设培训机构淮北集团网站建设

한국 기술 기업 카카오의 AI 팀 카나나가 공식적으로 36억 파라미터의 이중 언어 멀티모달 대규모 언어 모델 "kanana-1.5-v-3b-instruct"를 선보였습니다. 이 모델은 경량화된 배포의 이점을 유지하면서도 뛰어난 이미지 이해 및 교차 언어 처리 능력을 보여주었으며…

张小明 2025/12/31 2:55:35 网站建设