成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【多線程編程核心技術(shù)】多線程的死鎖

tabalt / 3691人閱讀

摘要:使用工具監(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

相關(guān)文章

  • 線程編程完全指南

    摘要:在這個(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ò)分布式集群不僅可以大...

    mengera88 評(píng)論0 收藏0
  • Java線程學(xué)習(xí)(七)并發(fā)編程中一些問(wèn)題

    摘要:因?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...

    yimo 評(píng)論0 收藏0
  • Java線程學(xué)習(xí)(七)并發(fā)編程中一些問(wèn)題

    摘要:相比與其他操作系統(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...

    dingding199389 評(píng)論0 收藏0
  • (二)線程應(yīng)用及挑戰(zhàn)

    摘要:上下文切換會(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ā)編程的...

    hqman 評(píng)論0 收藏0
  • 線程死鎖就是這么簡(jiǎn)單

    摘要:此時(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)了解一下嗎? 本篇主要是講解死鎖,這是我在多線程的最后一篇了。主要將多線程...

    winterdawn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<