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