电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java中的線(xiàn)程死鎖是什么?如何避免?

瀏覽:47日期:2022-08-25 11:17:34

認(rèn)識(shí)線(xiàn)程死鎖

多個(gè)線(xiàn)程同時(shí)被阻塞,它們中的一個(gè)或者全部都在等待某個(gè)資源被釋放。由于線(xiàn)程被無(wú)限期地阻塞,因此程序不可能正常終止。

如下圖所示,線(xiàn)程 A 持有資源 2,線(xiàn)程 B 持有資源 1,他們同時(shí)都想申請(qǐng)對(duì)方的資源,所以這兩個(gè)線(xiàn)程就會(huì)互相等待而進(jìn)入死鎖狀態(tài)。

Java中的線(xiàn)程死鎖是什么?如何避免?

下面通過(guò)一個(gè)例子來(lái)說(shuō)明線(xiàn)程死鎖,代碼模擬了上圖的死鎖的情況 (代碼來(lái)源于《并發(fā)編程之美》):

public class DeadLockDemo { private static Object resource1 = new Object();//資源 1 private static Object resource2 = new Object();//資源 2 public static void main(String[] args) { new Thread(() -> { synchronized (resource1) { System.out.println(Thread.currentThread() + 'get resource1'); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread() + 'waiting get resource2'); synchronized (resource2) { System.out.println(Thread.currentThread() + 'get resource2'); } } }, '線(xiàn)程 1').start(); new Thread(() -> { synchronized (resource2) { System.out.println(Thread.currentThread() + 'get resource2'); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread() + 'waiting get resource1'); synchronized (resource1) { System.out.println(Thread.currentThread() + 'get resource1'); } } }, '線(xiàn)程 2').start(); }}

Output

Thread[線(xiàn)程 1,5,main]get resource1Thread[線(xiàn)程 2,5,main]get resource2Thread[線(xiàn)程 1,5,main]waiting get resource2Thread[線(xiàn)程 2,5,main]waiting get resource1

線(xiàn)程 A 通過(guò) synchronized (resource1) 獲得 resource1 的監(jiān)視器鎖,然后通過(guò)Thread.sleep(1000);讓線(xiàn)程 A 休眠 1s 為的是讓線(xiàn)程 B 得到執(zhí)行然后獲取到 resource2 的監(jiān)視器鎖。線(xiàn)程 A 和線(xiàn)程 B 休眠結(jié)束了都開(kāi)始企圖請(qǐng)求獲取對(duì)方的資源,然后這兩個(gè)線(xiàn)程就會(huì)陷入互相等待的狀態(tài),這也就產(chǎn)生了死鎖。上面的例子符合產(chǎn)生死鎖的四個(gè)必要條件。

學(xué)過(guò)操作系統(tǒng)的朋友都知道產(chǎn)生死鎖必須具備以下四個(gè)條件:

互斥條件:該資源任意一個(gè)時(shí)刻只由一個(gè)線(xiàn)程占用。 請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放。 不剝奪條件:線(xiàn)程已獲得的資源在末使用完之前不能被其他線(xiàn)程強(qiáng)行剝奪,只有自己使用完畢后才釋放資源。 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。

如何避免線(xiàn)程死鎖?

我們只要破壞產(chǎn)生死鎖的四個(gè)條件中的其中一個(gè)就可以了。

破壞互斥條件

這個(gè)條件我們沒(méi)有辦法破壞,因?yàn)槲覀冇面i本來(lái)就是想讓他們互斥的(臨界資源需要互斥訪(fǎng)問(wèn))。

破壞請(qǐng)求與保持條件

一次性申請(qǐng)所有的資源。

破壞不剝奪條件

占用部分資源的線(xiàn)程進(jìn)一步申請(qǐng)其他資源時(shí),如果申請(qǐng)不到,可以主動(dòng)釋放它占有的資源。

破壞循環(huán)等待條件

靠按序申請(qǐng)資源來(lái)預(yù)防。按某一順序申請(qǐng)資源,釋放資源則反序釋放。破壞循環(huán)等待條件。

我們對(duì)線(xiàn)程 2 的代碼修改成下面這樣就不會(huì)產(chǎn)生死鎖了。

new Thread(() -> { synchronized (resource1) { System.out.println(Thread.currentThread() + 'get resource1'); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread() + 'waiting get resource2'); synchronized (resource2) { System.out.println(Thread.currentThread() + 'get resource2'); } } }, '線(xiàn)程 2').start();

Output

Thread[線(xiàn)程 1,5,main]get resource1Thread[線(xiàn)程 1,5,main]waiting get resource2Thread[線(xiàn)程 1,5,main]get resource2Thread[線(xiàn)程 2,5,main]get resource1Thread[線(xiàn)程 2,5,main]waiting get resource2Thread[線(xiàn)程 2,5,main]get resource2

Process finished with exit code 0

我們分析一下上面的代碼為什么避免了死鎖的發(fā)生?

線(xiàn)程 1 首先獲得到 resource1 的監(jiān)視器鎖,這時(shí)候線(xiàn)程 2 就獲取不到了。然后線(xiàn)程 1 再去獲取 resource2 的監(jiān)視器鎖,可以獲取到。然后線(xiàn)程 1 釋放了對(duì) resource1、resource2 的監(jiān)視器鎖的占用,線(xiàn)程 2 獲取到就可以執(zhí)行了。這樣就破壞了破壞循環(huán)等待條件,因此避免了死鎖。

以上就是Java中的線(xiàn)程死鎖是什么?如何避免?的詳細(xì)內(nèi)容,更多關(guān)于Java 線(xiàn)程死鎖的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 纯化水设备-纯水设备-超纯水设备-[大鹏水处理]纯水设备一站式服务商-东莞市大鹏水处理科技有限公司 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 浇注料-高铝砖耐火砖-郑州凯瑞得窑炉耐火材料有限公司 | 多功能三相相位伏安表-变压器短路阻抗测试仪-上海妙定电气 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 尚为传动-专业高精密蜗轮蜗杆,双导程蜗轮蜗杆,蜗轮蜗杆减速机,蜗杆减速机生产厂家 | 背压阀|减压器|不锈钢减压器|减压阀|卫生级背压阀|单向阀|背压阀厂家-上海沃原自控阀门有限公司 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 精益专家 - 设备管理软件|HSE管理系统|设备管理系统|EHS安全管理系统 | 广东燎了网络科技有限公司官网-网站建设-珠海网络推广-高端营销型外贸网站建设-珠海专业h5建站公司「了了网」 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 刑事律师_深圳著名刑事辩护律师_王平聚【清华博士|刑法教授】 | 单螺旋速冻机-双螺旋-流态化-隧道式-食品速冻机厂家-广州冰泉制冷 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 全国国际学校排名_国际学校招生入学及学费-学校大全网 | 工业胀紧套_万向节联轴器_链条-规格齐全-型号选购-非标订做-厂家批发价格-上海乙谛精密机械有限公司 | 电销卡_北京电销卡_包月电话卡-豪付网络 | 高压绝缘垫-红色配电房绝缘垫-绿色高压绝缘地毯-上海苏海电气 | 昆山新莱洁净应用材料股份有限公司-卫生级蝶阀,无菌取样阀,不锈钢隔膜阀,换向阀,离心泵 | 威客电竞(vk·game)·电子竞技赛事官网| 屏蔽泵厂家,化工屏蔽泵_维修-淄博泵业| 净化工程_无尘车间_无尘车间装修-广州科凌净化工程有限公司 | 锡膏喷印机-全自动涂覆机厂家-全自动点胶机-视觉点胶机-深圳市博明智控科技有限公司 | 阳光模拟试验箱_高低温试验箱_高低温冲击试验箱_快速温变试验箱|东莞市赛思检测设备有限公司 | 蒸压釜_蒸养釜_蒸压釜厂家-山东鑫泰鑫智能装备有限公司 | 查分易-成绩发送平台官网| 道达尔润滑油-食品级润滑油-道达尔导热油-合成导热油,深圳道达尔代理商合-深圳浩方正大官网 | jrs高清nba(无插件)直播-jrs直播低调看直播-jrs直播nba-jrs直播 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 昆明网络公司|云南网络公司|昆明网站建设公司|昆明网页设计|云南网站制作|新媒体运营公司|APP开发|小程序研发|尽在昆明奥远科技有限公司 | 低噪声电流前置放大器-SR570电流前置放大器-深圳市嘉士达精密仪器有限公司 | 扒渣机厂家_扒渣机价格_矿用扒渣机_铣挖机_撬毛台车_襄阳永力通扒渣机公司 | 黄石妇科医院_黄石东方女子医院_黄石东方妇产医院怎么样 | 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 合肥网带炉_安徽箱式炉_钟罩炉-合肥品炙装备科技有限公司 | 北京翻译公司-专业合同翻译-医学标书翻译收费标准-慕迪灵 | 山东钢衬塑罐_管道_反应釜厂家-淄博富邦滚塑防腐设备科技有限公司 | 环境模拟实验室_液体-气体控温机_气体控温箱_无锡双润冷却科技有限公司 | 珠宝展柜-玻璃精品展柜-首饰珠宝展示柜定制-鸿钛展柜厂家 | 电磁铁_小型推拉电磁铁_电磁阀厂家-深圳市宗泰电机有限公司 | ASA膜,ASA共挤料,篷布色母料-青岛未来化学有限公司 | 软文推广发布平台_新闻稿件自助发布_媒体邀约-澜媒宝 | 引领中高档酒店加盟_含舍·美素酒店品牌官网 |