5. 死鎖

線程死鎖

死鎖是兩個或更多線程阻塞著等待其它處于死鎖狀態(tài)的線程所持有的鎖胧辽。死鎖通常發(fā)生在多個線程同時但以不同的順序請求同一組鎖的時候糙臼。

public class TreeNode {
 
  TreeNode parent   = null;  
  List children = new ArrayList();

  public synchronized void addChild(TreeNode child){
    if(!this.children.contains(child)) {
      this.children.add(child);
      child.setParentOnly(this);
    }
  }
  
  public synchronized void addChildOnly(TreeNode child){
    if(!this.children.contains(child){
      this.children.add(child);
    }
  }
  
  public synchronized void setParent(TreeNode parent){
    this.parent = parent;
    parent.addChildOnly(this);
  }

  public synchronized void setParentOnly(TreeNode parent){
    this.parent = parent;
  }
}

// Thread 1: parent.addChild(child); //locks parent
          --> child.setParentOnly(parent);

// Thread 2: child.setParent(parent); //locks child
          --> parent.addChildOnly()

如果child和parent是同一個對象,而且兩個線程同時執(zhí)行,兩個線程同時獲得鎖,那么此時就會發(fā)生死鎖愉适。沒有辦法預測什么時候死鎖會發(fā)生,僅僅是可能會發(fā)生癣漆。

數(shù)據(jù)庫死鎖

當在一個事務中更新一條記錄维咸,這條記錄就會被鎖住避免其他事務的更新請求,直到第一個事務結束惠爽。同一個事務中每一個更新請求都可能會鎖住一些記錄癌蓖。當多個事務同時需要對一些相同的記錄做更新操作時,就很有可能發(fā)生死鎖婚肆。

死鎖的預防

鎖的順序

死鎖在多線程以不同的順序請求相同的鎖的時候發(fā)生租副。如果保證所有線程加鎖的順序相同,那么久不會發(fā)生死鎖较性。

public class DeadLockFixed {

    public void method1() {
        synchronized(Integer.class) {
            System.out.println("Aquired lock on Integer.class object");
            synchronized (String.class) {
                System.out.println("Aquired lock on String.class object");
            }
        }
    }
    
    public void method2() {
        synchronized (Integer.class) {
            System.out.println("Aquired lock on Integer.class object");
            synchronized (String.class) {
                System.out.println("Aquired lock on String.class object");
            }
        }
    }
}

鎖超時

另外一個可以避免死鎖的方法是在嘗試獲取鎖的時候加一個超時時間用僧,這也就意味著在嘗試獲取鎖的過程中若超過了這個時限該線程則放棄對該鎖請求。若一個線程沒有在給定的時限內成功獲得所有需要的鎖赞咙,則會進行回退并釋放所有已經(jīng)獲得的鎖责循,然后等待一段隨機的時間再重試。這段隨機的等待時間讓其它線程有機會嘗試獲取相同的這些鎖攀操,并且讓該應用在沒有獲得鎖的時候可以繼續(xù)運行院仿。

如果有非常多的線程同一時間去競爭同一批資源,就算有超時和回退機制崔赌,還是可能會導致這些線程重復地嘗試但卻始終得不到鎖意蛀。如果只有兩個線程,并且重試的超時時間設定為0到500毫秒之間健芭,這種現(xiàn)象可能不會發(fā)生县钥,但是如果是10個或20個線程情況就不同了。

死鎖檢測

使用一個數(shù)據(jù)結構維護線程所獲取的鎖慈迈。當鎖請求失敗的時候若贮,線程遍歷鎖關系圖查看是否有死鎖發(fā)生。

解決死鎖方法:

  • 釋放所有鎖痒留,回退谴麦,等待一定時間后重試
  • 給這些線程設置優(yōu)先級,讓一個或者多個線程進行回退
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末伸头,一起剝皮案震驚了整個濱河市匾效,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恤磷,老刑警劉巖面哼,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件野宜,死亡現(xiàn)場離奇詭異,居然都是意外死亡魔策,警方通過查閱死者的電腦和手機匈子,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闯袒,“玉大人虎敦,你說我怎么就攤上這事≌遥” “怎么了其徙?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長堕仔。 經(jīng)常有香客問我擂橘,道長,這世上最難降的妖魔是什么摩骨? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任通贞,我火速辦了婚禮,結果婚禮上恼五,老公的妹妹穿的比我還像新娘昌罩。我一直安慰自己,他們只是感情好灾馒,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布茎用。 她就那樣靜靜地躺著,像睡著了一般睬罗。 火紅的嫁衣襯著肌膚如雪轨功。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天容达,我揣著相機與錄音古涧,去河邊找鬼。 笑死花盐,一個胖子當著我的面吹牛羡滑,可吹牛的內容都是我干的。 我是一名探鬼主播算芯,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼柒昏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了熙揍?” 一聲冷哼從身側響起职祷,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后堪旧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體削葱,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡奖亚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年淳梦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昔字。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡爆袍,死狀恐怖,靈堂內的尸體忽然破棺而出作郭,到底是詐尸還是另有隱情陨囊,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布夹攒,位于F島的核電站蜘醋,受9級特大地震影響,放射性物質發(fā)生泄漏咏尝。R本人自食惡果不足惜压语,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望编检。 院中可真熱鬧胎食,春花似錦、人聲如沸允懂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蕾总。三九已至粥航,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間生百,已是汗流浹背递雀。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留置侍,地道東北人映之。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像蜡坊,于是被迫代替她去往敵國和親杠输。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容