最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中死鎖的原理實(shí)戰(zhàn)分析

 更新時(shí)間:2019年08月27日 09:56:47   作者:cakincqm  
這篇文章主要介紹了Java中死鎖的原理,結(jié)合具體案例形式分析了java死鎖形成的相關(guān)原理,需要的朋友可以參考下

本文實(shí)例講述了Java中死鎖的原理。分享給大家供大家參考,具體如下:

一 點(diǎn)睛

當(dāng)兩個(gè)線(xiàn)程相互等待對(duì)方釋放同步監(jiān)視器時(shí)就會(huì)發(fā)生死鎖,Java虛擬機(jī)沒(méi)有監(jiān)測(cè)、也沒(méi)有采用措施來(lái)處理死鎖情況,所以多線(xiàn)程編程時(shí)應(yīng)該采取措施避免死鎖的出現(xiàn)。

一旦出現(xiàn)死鎖,整個(gè)程序既不會(huì)發(fā)生任何異常,也不會(huì)給出任何提示,只是所有線(xiàn)程處于阻塞狀態(tài),無(wú)法繼續(xù)。

二 代碼

class A
{
   public synchronized void foo( B b )
   {
      System.out.println("當(dāng)前線(xiàn)程名: " + Thread.currentThread().getName()
        + " 進(jìn)入了A實(shí)例的foo()方法" );   // ①
      try
      {
        Thread.sleep(200);
      }
      catch (InterruptedException ex)
      {
        ex.printStackTrace();
      }
      System.out.println("當(dāng)前線(xiàn)程名: " + Thread.currentThread().getName()
        + " 企圖調(diào)用B實(shí)例的last()方法");  // ③
      b.last();
   }
   public synchronized void last()
   {
      System.out.println("進(jìn)入了A類(lèi)的last()方法內(nèi)部");
   }
}
class B
{
   public synchronized void bar( A a )
   {
      System.out.println("當(dāng)前線(xiàn)程名: " + Thread.currentThread().getName()
        + " 進(jìn)入了B實(shí)例的bar()方法" );  // ②
      try
      {
        Thread.sleep(200);
      }
      catch (InterruptedException ex)
      {
        ex.printStackTrace();
      }
      System.out.println("當(dāng)前線(xiàn)程名: " + Thread.currentThread().getName()
        + " 企圖調(diào)用A實(shí)例的last()方法"); // ④
      a.last();
   }
   public synchronized void last()
   {
      System.out.println("進(jìn)入了B類(lèi)的last()方法內(nèi)部");
   }
}
public class DeadLock implements Runnable
{
   A a = new A();
   B b = new B();
   public void init()
   {
      Thread.currentThread().setName("主線(xiàn)程");
      // 調(diào)用a對(duì)象的foo方法
      a.foo(b);
      System.out.println("進(jìn)入了主線(xiàn)程之后");
   }
   public void run()
   {
      Thread.currentThread().setName("副線(xiàn)程");
      // 調(diào)用b對(duì)象的bar方法
      b.bar(a);
      System.out.println("進(jìn)入了副線(xiàn)程之后");
   }
   public static void main(String[] args)
   {
      DeadLock dl = new DeadLock();
      // 以dl為target啟動(dòng)新線(xiàn)程
      new Thread(dl).start();
      // 調(diào)用init()方法
      dl.init();
   }
}

三 運(yùn)行結(jié)果

當(dāng)前線(xiàn)程名: 主線(xiàn)程 進(jìn)入了A實(shí)例的foo()方法
當(dāng)前線(xiàn)程名: 副線(xiàn)程 進(jìn)入了B實(shí)例的bar()方法
當(dāng)前線(xiàn)程名: 主線(xiàn)程 企圖調(diào)用B實(shí)例的last()方法
當(dāng)前線(xiàn)程名: 副線(xiàn)程 企圖調(diào)用A實(shí)例的last()方法

四 說(shuō)明

從運(yùn)行結(jié)果來(lái)看,程序無(wú)法向下執(zhí)行,也不會(huì)拋出任何異常,就一直“僵持”者。

上面代碼中的A對(duì)象和B對(duì)象的方法都是同步方法,也就是A對(duì)象和B對(duì)象都是同步鎖。

程序中有兩個(gè)線(xiàn)程執(zhí)行,一個(gè)線(xiàn)程的線(xiàn)程執(zhí)行體是DeadLock類(lèi)的run()方法,另外一個(gè)是DeadLock的init()方法(主線(xiàn)程調(diào)用init()方法)。其中run()方法讓B對(duì)象調(diào)用bar()方法,而init()方法讓A對(duì)象調(diào)用foo()方法。

程序運(yùn)行的流程如下:

  • 1 init()方法先執(zhí)行,調(diào)用A對(duì)象的foo()方法,進(jìn)入foo()方法之前,該線(xiàn)程對(duì)A對(duì)象加鎖,進(jìn)入foo()方法后,打印一下,然后暫停執(zhí)行200ms
  • 2 CPU切換到另外一個(gè)線(xiàn)程,讓B對(duì)象執(zhí)行bar方法,進(jìn)入bar()方法之前,該線(xiàn)程對(duì)B對(duì)象加鎖,進(jìn)入bar()方法后,打印一下,然后暫停執(zhí)行200ms
  • 3 主線(xiàn)程先醒過(guò)來(lái),繼續(xù)向下執(zhí)行,當(dāng)調(diào)用B對(duì)象的last方法時(shí),會(huì)被阻塞,因?yàn)榇藭r(shí)必須對(duì)B對(duì)象進(jìn)行加鎖,但此時(shí)副線(xiàn)程正保持B對(duì)象的鎖,所以此時(shí)主線(xiàn)程會(huì)一直等待。
  • 4 副線(xiàn)程會(huì)醒過(guò)來(lái),會(huì)繼續(xù)往下執(zhí)行,當(dāng)調(diào)用A對(duì)象的last方法時(shí),會(huì)被阻塞,因?yàn)榇藭r(shí)必須對(duì)A對(duì)象加鎖,但此時(shí)主線(xiàn)程正保持A對(duì)象的鎖,所以此時(shí)副線(xiàn)程會(huì)一直等待。
  • 5 兩個(gè)線(xiàn)程互相等待對(duì)方先釋放,所以出現(xiàn)了死鎖。

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Java進(jìn)程與線(xiàn)程操作技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • java計(jì)算自?xún)鐢?shù)和水仙花數(shù)

    java計(jì)算自?xún)鐢?shù)和水仙花數(shù)

    對(duì)于一個(gè)正整數(shù)而言,長(zhǎng)度是n,如果它的各位上的數(shù)字的n次方之和正好等于它本身,那么我們稱(chēng)這樣的數(shù)為自?xún)鐢?shù),下面使用JAVA實(shí)現(xiàn)這個(gè)方法
    2014-03-03
  • window版 IntelliJ IDEA 快捷鍵圖文教程

    window版 IntelliJ IDEA 快捷鍵圖文教程

    本文通過(guò)圖文并茂的形式給大家介紹了window版 IntelliJ IDEA 快捷鍵的操作方法,需要的朋友參考下吧
    2018-02-02
  • spring是如何解析xml配置文件中的占位符

    spring是如何解析xml配置文件中的占位符

    這篇文章主要介紹了spring是如何解析xml配置文件中的占位符,幫助大家更好的理解和使用spring框架,感興趣的朋友可以了解下
    2020-11-11
  • SpringBoot 防御 CSRF 攻擊的流程及原理解析

    SpringBoot 防御 CSRF 攻擊的流程及原理解析

    CSRF是一種非常常見(jiàn)的Web攻擊方式,其實(shí)是很好防御的,但是由于經(jīng)常被很多開(kāi)發(fā)者忽略,進(jìn)而導(dǎo)致很多網(wǎng)站實(shí)際上都存在 CSRF 攻擊的安全隱患,這篇文章主要介紹了SpringBoot 如何防御 CSRF 攻擊,需要的朋友可以參考下
    2023-05-05
  • IDEA入門(mén)級(jí)使用教程你居然還在用eclipse?

    IDEA入門(mén)級(jí)使用教程你居然還在用eclipse?

    上個(gè)月,idea的使用量超越eclipse的消息席卷了整個(gè)IT界,idea到底好在哪里呢?下面小編通過(guò)本文給大家詳細(xì)介紹下IDEA入門(mén)級(jí)使用教程,非常詳細(xì),感興趣的朋友一起看看吧
    2020-10-10
  • SpringBoot基于Redis實(shí)現(xiàn)token的在線(xiàn)續(xù)期的實(shí)踐

    SpringBoot基于Redis實(shí)現(xiàn)token的在線(xiàn)續(xù)期的實(shí)踐

    本文主要介紹了使用Redis實(shí)現(xiàn)JWT令牌在線(xiàn)續(xù)期的方案,通過(guò)在線(xiàn)續(xù)期token,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • ChatGPT在IDEA中使用的詳細(xì)過(guò)程

    ChatGPT在IDEA中使用的詳細(xì)過(guò)程

    這篇文章主要介紹了ChatGPT在IDEA中使用的詳細(xì)過(guò)程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • 如何在Spring Boot應(yīng)用中優(yōu)雅的使用Date和LocalDateTime的教程詳解

    如何在Spring Boot應(yīng)用中優(yōu)雅的使用Date和LocalDateTime的教程詳解

    這篇文章主要介紹了如何在Spring Boot應(yīng)用中優(yōu)雅的使用Date和LocalDateTime,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • springboot中使用雪花算法生成雪花ID

    springboot中使用雪花算法生成雪花ID

    本文主要介紹了springboot中使用雪花算法生成雪花ID,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • JAVA驗(yàn)證碼工具實(shí)例代碼

    JAVA驗(yàn)證碼工具實(shí)例代碼

    這篇文章主要介紹了JAVA驗(yàn)證碼工具實(shí)例代碼,需要的朋友可以參考下
    2018-03-03

最新評(píng)論

孙吴县| 平阴县| 泾阳县| 平潭县| 松滋市| 宝应县| 布尔津县| 介休市| 辛集市| 南川市| 七台河市| 巨鹿县| 岱山县| 余庆县| 晋中市| 海宁市| 监利县| 历史| 定西市| 武冈市| 尼勒克县| 儋州市| 武山县| 石城县| 衡阳市| 西青区| 珲春市| 罗平县| 长宁县| 托克逊县| 迁安市| 唐山市| 茌平县| 贵港市| 托里县| 平泉县| SHOW| 吴旗县| 沐川县| 桂平市| 涟水县|