溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java 中死鎖問(wèn)題的實(shí)例詳解

發(fā)布時(shí)間:2020-10-03 13:36:09 來(lái)源:腳本之家 閱讀:142 作者:CC小觀 欄目:編程語(yǔ)言

java 中死鎖問(wèn)題的實(shí)例詳解

先看代碼在做解釋

public class DeadLock implements Runnable{
  String a;
  String b;
  boolean flag;
  public DeadLock(String a,String b,boolean flag){
    this.a=a;
    this.b=b;
    this.flag=flag;
  }
  public void run(){
    if(flag){
//     while(true){
          synchronized(a){
            System.out.println("鎖a");
            synchronized(b){
              System.out.println("鎖b----");
            }
          }
//       }
    }else{
//   while(true){
        synchronized(b){
          System.out.println("鎖b");
          synchronized(a){
            System.out.println("鎖a----");
          }
        }
//     }
    }
  }

  public static void main(String[] args){
  String a=new String("a");
  String b=new String("b");
  DeadLock d1=new DeadLock(a,b,true);
  DeadLock d2=new DeadLock(a,b,false);
  Thread t1=new Thread(d1);
  Thread t2=new Thread(d2);
  t1.start();
  t2.start();
  System.out.println("歡聲笑語(yǔ)中打出GG");
  }

}

以上是代碼部分,如果沒(méi)有死鎖,可以在if下加while(true),必然死鎖,下面來(lái)做說(shuō)明。

這個(gè)僅僅是為了理解死鎖和面試用的,創(chuàng)建兩個(gè)對(duì)象a和b只是為了作為死鎖的對(duì)象而用,線程t1運(yùn)行(t1.start()),線程t1拿到鎖a后,需要繼續(xù)執(zhí)行,拿到鎖b,而線程t2運(yùn)行(t2.start()),拿到鎖b,想繼續(xù)拿到鎖a繼續(xù)執(zhí)行,這就形成死鎖,互相持有對(duì)面所需要的鎖對(duì)象。

如果面試,可以簡(jiǎn)單記下,兩個(gè)線程,兩個(gè)鎖對(duì)象,鎖互相嵌套,最少兩種狀態(tài),同時(shí)執(zhí)行,一次不行就多次,也可鎖外面加循環(huán),讓線程多次運(yùn)行,就會(huì)死鎖,因?yàn)檫\(yùn)行一次,可能存在偶然,第一個(gè)線程執(zhí)行完了,鎖對(duì)象釋放了,第二個(gè)線程才進(jìn)來(lái)執(zhí)行,如此就有偶然現(xiàn)象。

如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI