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

您的位置:首頁技術文章
文章詳情頁

Java多線程死鎖與資源限制操作

瀏覽:4日期:2022-08-23 14:11:37

鎖是個非常有用的工具,運用場景非常多,因為它使用起來非常簡單,而且易于理解。但同時它也會帶來一些困擾,那就是可能會引起死鎖,一旦產生死鎖,就會造成系統功能不可用。

死鎖的概念

那什么是死鎖呢?所謂死鎖: 是指兩個或兩個以上的進程在執行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處于死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。

死鎖產生的必要條件

1)互斥條件:指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程占用。如果此時還有其它進程請求資源,則請求者只能等待,直至占有資源的進程用畢釋放。

2)請求和保持條件:指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程占有,此時請求進程阻塞,但又對自己已獲得的其它資源保持不放。

3)不剝奪條件:指進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。

4)環路等待條件:指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1占用的資源;P1正在等待P2占用的資源,……,Pn正在等待已被P0占用的資源。

死鎖代碼實例

public class DeadLockDemo { private static String A = 'A'; private static String B = 'B'; public static void main(String[] args) { new DeadLockDemo().deadLock(); } /** * 死鎖 * @author fuyuwei * 2017年5月13日 下午9:27:32 */ private void deadLock() { Thread t1 = new Thread(new Runnable() { @SuppressWarnings('static-access') @Override public void run() {synchronized (A) { try { Thread.currentThread().sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (B) { System.out.println('1'); }} } }); Thread t2 = new Thread(new Runnable() { @Override public void run() {synchronized (B) { synchronized (A) { System.out.println('2'); }} } }); t1.start(); t2.start(); }}

線程A睡眠2秒之后鎖定B同步打印1,但是這時候B已經被第二個線程鎖定,并且第二天線程又鎖定A打印2,就這樣A等待B但是握著B不放,B等待A但是握著A不放,就產生了死鎖。

當然這段代碼純粹是為了演示死鎖,在實際工作中基本上不會出現這種代碼。在實際工作中線程可能拿到一個數據庫鎖,釋放鎖的時候拋出了異常,沒釋放掉。

一旦出現死鎖,業務是可感知的,因為不能繼續提供服務了,那么只能通過dump線程查看到底是哪個線程出現了問題,以下線程信息告訴我們是DeadLockDemo類的第42行和第31行引起的死鎖。

'Thread-2' prio=5 tid=7fc0458d1000 nid=0x116c1c000 waiting for monitor entry [116c1b000java.lang.Thread.State: BLOCKED (on object monitor)at com.ifeve.book.forkjoin.DeadLockDemo$2.run(DeadLockDemo.java:42)- waiting to lock <7fb2f3ec0> (a java.lang.String)- locked <7fb2f3ef8> (a java.lang.String)at java.lang.Thread.run(Thread.java:695)'Thread-1' prio=5 tid=7fc0430f6800 nid=0x116b19000 waiting for monitor entry [116b18000java.lang.Thread.State: BLOCKED (on object monitor)at com.ifeve.book.forkjoin.DeadLockDemo$1.run(DeadLockDemo.java:31)- waiting to lock <7fb2f3ef8> (a java.lang.String)- locked <7fb2f3ec0> (a java.lang.String)at java.lang.Thread.run(Thread.j

避免死鎖的方法

1、避免一個線程同時獲取多個鎖。

2、避免一個線程在鎖內同時占用多個資源,盡量保證每個鎖只占用一個資源。

3、嘗試使用定時鎖,使用lock.tryLock(timeout)來替代使用內部鎖機制。

4、對于數據庫鎖,加鎖和解鎖必須在一個數據庫連接里,否則會出現解鎖失敗的情況。

什么是資源限制

資源限制是指在進行并發編程時,程序的執行速度受限于計算機硬件資源或軟件資源。例如,服務器的帶寬只有2Mb/s,某個資源的下載速度是1Mb/s每秒,系統啟動10個線程下載資源,下載速度不會變成10Mb/s,所以在進行并發編程時,要考慮這些資源的限制。硬件資源限制有帶寬的上傳/下載速度、硬盤讀寫速度和CPU的處理速度。軟件資源限制有數據庫的連接數和socket連接數等。

資源限制引發的問題

在并發編程中,將代碼執行速度加快的原則是將代碼中串行執行的部分變成并發執行,但是如果將某段串行的代碼并發執行,因為受限于資源,仍然在串行執行,這時候程序不僅不會加快執行,反而會更慢,因為增加了上下文切換和資源調度的時間。例如,之前看到一段程序使用多線程在辦公網并發地下載和處理數據時,導致CPU利用率達到100%,幾個小時都不能運行完成任務,后來修改成單線程,一個小時就執行完成了。

如何解決資源限制的問題

對于硬件資源限制,可以考慮使用集群并行執行程序。既然單機的資源有限制,那么就讓程序在多機上運行。比如使用ODPS、Hadoop或者自己搭建服務器集群,不同的機器處理不同的數據。可以通過“數據ID%機器數”,計算得到一個機器編號,然后由對應編號的機器處理這筆數據。對于軟件資源限制,可以考慮使用資源池將資源復用。比如使用連接池將數據庫和Socket連接復用,或者在調用對方webservice接口獲取數據時,只建立一個連接。

在資源限制情況下進行并發編程

如何在資源限制的情況下,讓程序執行得更快呢?方法就是,根據不同的資源限制調整程序的并發度,比如下載文件程序依賴于兩個資源——帶寬和硬盤讀寫速度。有數據庫操作時,涉及數據庫連接數,如果SQL語句執行非常快,而線程的數量比數據庫連接數大很多,則某些線程會被阻塞,等待數據庫連接。

補充知識:初入Java并發-避免死鎖的常見方法

1、避免一個線程同時獲取多個鎖

2、避免一個線程在鎖內同時占用多個資源,盡量保證每個鎖只占用一個資源

3、嘗試使用定時鎖,使用lock.tryLock(timeout)來替代使用內部鎖機制

4、對于數據庫鎖,加鎖和解鎖必須在一個數據庫連接里,否則會出現解鎖失敗的情況。

以上這篇Java多線程死鎖與資源限制操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 电竞学校_电子竞技培训学校学院-梦竞未来电竞学校官网 | 斗式提升机,斗式提升机厂家-淄博宏建机械有限公司 | 华夏医界网_民营医疗产业信息平台_民营医院营销管理培训 | 氧化锆纤维_1800度高温退火炉_1800度高温烧结炉-南京理工宇龙新材料股份有限公司 | 土壤有机碳消解器-石油|表层油类分析采水器-青岛溯源环保设备有限公司 | 餐饮小吃技术培训-火锅串串香培训「何小胖培训」_成都点石成金[官网] | 润东方环保空调,冷风机,厂房车间降温设备-20年深圳环保空调生产厂家 | 河北凯普威医疗器材有限公司,高档轮椅系列,推车系列,座厕椅系列,协步椅系列,拐扙系列,卫浴系列 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 酒精检测棒,数显温湿度计,酒安酒精测试仪,酒精检测仪,呼气式酒精检测仪-郑州欧诺仪器有限公司 | LHH药品稳定性试验箱-BPS系列恒温恒湿箱-意大利超低温冰箱-上海一恒科学仪器有限公司 | 暴风影音| 水成膜泡沫灭火剂_氟蛋白泡沫液_河南新乡骏华消防科技厂家 | 全自动翻转振荡器-浸出式水平振荡器厂家-土壤干燥箱价格-常州普天仪器 | 企小优-企业数字化转型服务商_网络推广_网络推广公司 | 浙江红酒库-冰雕库-气调库-茶叶库安装-医药疫苗冷库-食品物流恒温恒湿车间-杭州领顺实业有限公司 | 板材品牌-中国胶合板行业十大品牌-环保板材-上海声达板材 | 垃圾清运公司_环卫保洁公司_市政道路保洁公司-华富环境 | 东莞精密模具加工,精密连接器模具零件,自動機零件,冶工具加工-益久精密 | 香蕉筛|直线|等厚|弧形|振动筛|香蕉筛厂家-洛阳隆中重工 | 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 | 杭州火蝠电商_京东代运营_拼多多全托管代运营【天猫代运营】 | 涡街流量计_LUGB智能管道式高温防爆蒸汽温压补偿计量表-江苏凯铭仪表有限公司 | 炒货机-炒菜机-炒酱机-炒米机@霍氏机械 | 清洁设备_洗地机/扫地机厂家_全自动洗地机_橙犀清洁设备官网 | 网架支座@球铰支座@钢结构支座@成品支座厂家@万向滑动支座_桥兴工程橡胶有限公司 | 奶茶加盟,奶茶加盟店连锁品牌-甜啦啦官网 | 等离子表面处理机-等离子表面活化机-真空等离子清洗机-深圳市东信高科自动化设备有限公司 | 东莞螺杆空压机_永磁变频空压机_节能空压机_空压机工厂批发_深圳螺杆空压机_广州螺杆空压机_东莞空压机_空压机批发_东莞空压机工厂批发_东莞市文颖设备科技有限公司 | 青岛成人高考_山东成考报名网 | Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 电缆隧道在线监测-智慧配电站房-升压站在线监测-江苏久创电气科技有限公司 | 葡萄酒灌装机-食用油灌装机-液体肥灌装设备厂家_青州惠联灌装机械 | 荣事达手推洗地机_洗地机厂家_驾驶式扫地机_工业清洁设备 | 缠膜机|缠绕包装机|无纺布包装机-济南达伦特机械设备有限公司 | 北钻固控设备|石油钻采设备-石油固控设备厂家 | 胜为光纤光缆_光纤跳线_单模尾纤_光纤收发器_ODF光纤配线架厂家直销_北京睿创胜为科技有限公司 - 北京睿创胜为科技有限公司 | 主题班会网 - 安全教育主题班会,各类主题班会PPT模板 | 浙江上沪阀门有限公司| COD分析仪|氨氮分析仪|总磷分析仪|总氮分析仪-圣湖Greatlake | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 |