亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

一 點睛

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

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

二 代碼

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

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

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

四 說明

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

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

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

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

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

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

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

相關(guān)文章

  • 在spring?boot3中使用native?image的最新方法

    在spring?boot3中使用native?image的最新方法

    這篇文章主要介紹了在spring?boot3中使用native?image?,今天我們用具體的例子來給大家演示一下如何正確的將spring boot3的應(yīng)用編譯成為native image,需要的朋友可以參考下
    2023-01-01
  • java反射機(jī)制根據(jù)屬性名獲取屬性值的操作

    java反射機(jī)制根據(jù)屬性名獲取屬性值的操作

    這篇文章主要介紹了java反射機(jī)制根據(jù)屬性名獲取屬性值的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 一文帶你弄懂Java中線程池的原理

    一文帶你弄懂Java中線程池的原理

    工作中,我們經(jīng)常使用線程池,但是你真的了解線程池的原理嗎?同時,線程池工作原理和底層實現(xiàn)原理也是面試經(jīng)常問的考題,所以,今天我們一起聊聊線程池的原理吧
    2022-12-12
  • Intellij IDEA調(diào)試技巧的深入講解

    Intellij IDEA調(diào)試技巧的深入講解

    這篇文章主要給大家介紹了關(guān)于Intellij IDEA調(diào)試技巧的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • JavaWeb入門:ServletContext詳解和應(yīng)用

    JavaWeb入門:ServletContext詳解和應(yīng)用

    這篇文章主要介紹了Java ServletContext對象用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-07-07
  • MybatisPlus3.3.0沒有MybatisPlusInterceptor類問題的解決方法

    MybatisPlus3.3.0沒有MybatisPlusInterceptor類問題的解決方法

    項目使用的是mybatis-plus-extension3.3.0依賴,然后在我使用分頁插件的時候,發(fā)現(xiàn)無法導(dǎo)入MybatisPlusInterceptor類所以本文給大家介紹了MybatisPlus3.3.0沒有MybatisPlusInterceptor類問題的解決方法,需要的朋友可以參考下
    2023-12-12
  • Java面試題目集錦

    Java面試題目集錦

    本文是小編日常收集整理的java面試題目,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • 詳解java設(shè)計模式之六大原則

    詳解java設(shè)計模式之六大原則

    這篇文章主要介紹了java設(shè)計模式之六大原則,對設(shè)計模式感興趣的同學(xué),可以參考下
    2021-05-05
  • 使用Maven 搭建 Spring MVC 本地部署Tomcat的詳細(xì)教程

    使用Maven 搭建 Spring MVC 本地部署Tomcat的詳細(xì)教程

    這篇文章主要介紹了使用Maven 搭建 Spring MVC 本地部署Tomcat,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Spring循環(huán)依賴實現(xiàn)過程揭秘

    Spring循環(huán)依賴實現(xiàn)過程揭秘

    這篇文章主要介紹了Spring循環(huán)依賴實現(xiàn)過程,Spring的解決循環(huán)依賴是有前置條件的,要解決循環(huán)依賴我們首先要了解Spring Bean對象的創(chuàng)建過程和依賴注入的方式
    2023-01-01

最新評論