摘要:使用工具監(jiān)測(cè)死鎖進(jìn)入的安裝目錄中的目錄,執(zhí)行命令可以看出得到運(yùn)行的線程的值為,再執(zhí)行命令,查看結(jié)果
死鎖
Java 線程是死鎖是一個(gè)經(jīng)典的多線程問(wèn)題,因?yàn)椴煌木€程都在等待根本不可能被釋放的鎖,從而導(dǎo)致所有的任務(wù)都無(wú)法繼續(xù)完成
舉個(gè)例子DealThread.java
package dealThread.demo; public class DealThread implements Runnable{ public String username; public Object lock1 = new Object(); public Object lock2 = new Object(); public void setFlag(String username){ this.username = username; } @Override public void run(){ if(username.equals("a")){ synchronized (lock1){ try{ System.out.println("username="+username); Thread.sleep(3000); }catch(InterruptedException e){ e.printStackTrace(); } synchronized (lock2){ System.out.println("lock1 -> lock2"); } } } if(username.equals("b")){ synchronized (lock2){ try{ System.out.println("username="+username); Thread.sleep(3000); }catch(InterruptedException e){ e.printStackTrace(); } synchronized (lock1){ System.out.println("lock2 -> lock1"); } } } } }
Run.java
package dealThread.demo; public class Run { public static void main(String[] args){ try{ DealThread t1 = new DealThread(); t1.setFlag("a"); Thread thread1 = new Thread(t1); thread1.start(); Thread.sleep(1000); t1.setFlag("b"); Thread thread2 = new Thread(t1); thread2.start(); }catch(InterruptedException e){ e.printStackTrace(); } } }
運(yùn)行結(jié)果如下:
線程thread1和thread2都持有對(duì)方的鎖,而且需要等待對(duì)方釋放鎖之后才能往下繼續(xù)運(yùn)行,這個(gè)時(shí)候就發(fā)生了死鎖;其實(shí)不使用嵌套的synchronized代碼結(jié)構(gòu)也會(huì)出現(xiàn)死鎖,與嵌套不嵌套沒(méi)有任何關(guān)系,只要互相等待對(duì)方釋放鎖就有可能出現(xiàn)死鎖。
使用JDK工具監(jiān)測(cè)死鎖進(jìn)入JDK的安裝目錄中的bin目錄,執(zhí)行jps命令:
可以看出得到運(yùn)行的線程Run的id值為7404,再執(zhí)行jstack命令,查看結(jié)果:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72026.html
摘要:在這個(gè)范圍廣大的并發(fā)技術(shù)領(lǐng)域當(dāng)中多線程編程可以說(shuō)是基礎(chǔ)和核心,大多數(shù)抽象并發(fā)問(wèn)題的構(gòu)思與解決都是基于多線程模型來(lái)進(jìn)行的。一般來(lái)說(shuō),多線程程序會(huì)面臨三類問(wèn)題正確性問(wèn)題效率問(wèn)題死鎖問(wèn)題。 多線程編程或者說(shuō)范圍更大的并發(fā)編程是一種非常復(fù)雜且容易出錯(cuò)的編程方式,但是我們?yōu)槭裁催€要冒著風(fēng)險(xiǎn)艱辛地學(xué)習(xí)各種多線程編程技術(shù)、解決各種并發(fā)問(wèn)題呢? 因?yàn)椴l(fā)是整個(gè)分布式集群的基礎(chǔ),通過(guò)分布式集群不僅可以大...
摘要:因?yàn)槎嗑€程競(jìng)爭(zhēng)鎖時(shí)會(huì)引起上下文切換。減少線程的使用。舉個(gè)例子如果說(shuō)服務(wù)器的帶寬只有,某個(gè)資源的下載速度是,系統(tǒng)啟動(dòng)個(gè)線程下載該資源并不會(huì)導(dǎo)致下載速度編程,所以在并發(fā)編程時(shí),需要考慮這些資源的限制。 最近私下做一項(xiàng)目,一bug幾日未解決,總惶恐。一日頓悟,bug不可怕,怕的是項(xiàng)目不存在bug,與其懼怕,何不與其剛正面。 系列文章傳送門: Java多線程學(xué)習(xí)(一)Java多線程入門 Jav...
摘要:相比與其他操作系統(tǒng)包括其他類系統(tǒng)有很多的優(yōu)點(diǎn),其中有一項(xiàng)就是,其上下文切換和模式切換的時(shí)間消耗非常少。因?yàn)槎嗑€程競(jìng)爭(zhēng)鎖時(shí)會(huì)引起上下文切換。減少線程的使用。很多編程語(yǔ)言中都有協(xié)程。所以如何避免死鎖的產(chǎn)生,在我們使用并發(fā)編程時(shí)至關(guān)重要。 系列文章傳送門: Java多線程學(xué)習(xí)(一)Java多線程入門 Java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(1) java多線程學(xué)習(xí)(二)syn...
摘要:上下文切換會(huì)影響到線程的執(zhí)行速度,對(duì)于系統(tǒng)來(lái)說(shuō)意味著會(huì)消耗大量的時(shí)間減少上下文切換的方式無(wú)鎖并發(fā)編程,在多線程競(jìng)爭(zhēng)鎖時(shí),會(huì)導(dǎo)致大量的上下文切換。線程在中的使用在中實(shí)現(xiàn)多線程的方式比較簡(jiǎn)單,因?yàn)橹刑峁┝朔浅7奖愕膩?lái)實(shí)現(xiàn)多線程。 文章簡(jiǎn)介 上一篇文章我們了解了進(jìn)程和線程的發(fā)展歷史、線程的生命周期、線程的優(yōu)勢(shì)和使用場(chǎng)景,這一篇,我們從Java層面更進(jìn)一步了解線程的使用 內(nèi)容導(dǎo)航 并發(fā)編程的...
摘要:此時(shí)線程需要鎖才能繼續(xù)往下執(zhí)行。但是線程的鎖并沒(méi)有釋放,線程的鎖也沒(méi)有釋放。 前言 只有光頭才能變強(qiáng) 回顧前面: ThreadLocal就是這么簡(jiǎn)單 多線程三分鐘就可以入個(gè)門了! 多線程基礎(chǔ)必要知識(shí)點(diǎn)!看了學(xué)習(xí)多線程事半功倍 Java鎖機(jī)制了解一下 AQS簡(jiǎn)簡(jiǎn)單單過(guò)一遍 Lock鎖子類了解一下 線程池你真不來(lái)了解一下嗎? 本篇主要是講解死鎖,這是我在多線程的最后一篇了。主要將多線程...
閱讀 1243·2021-09-26 09:46
閱讀 1593·2021-09-06 15:00
閱讀 725·2019-08-30 15:52
閱讀 1126·2019-08-29 13:10
閱讀 1288·2019-08-26 13:47
閱讀 1485·2019-08-26 13:35
閱讀 2034·2019-08-23 18:38
閱讀 733·2019-08-23 17:59