死鎖

在實際編程中狐榔,死鎖雖然不常見,但是如果遇到死鎖便是致命的收捣。接下來了解一下《操作系統(tǒng)》對于死鎖產(chǎn)生條件的描述庵楷。

死鎖產(chǎn)生的條件:

  1. 互斥條件:所謂互斥就是進(jìn)程在某一時間內(nèi)獨占資源楣颠。

  2. 請求與保持條件:一個進(jìn)程因請求資源而阻塞時童漩,對已獲得的資源保持不放春锋。

  3. 不剝奪條件:進(jìn)程已獲得資源,在末使用完之前侧馅,不能強(qiáng)行剝奪能庆。

  4. 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。

死鎖的例子

public class Test { 
        public static void main(String[] args) { 
                DeadlockRisk dead = new DeadlockRisk(); 
                MyThread t1 = new MyThread(dead, 1, 2); 
                MyThread t2 = new MyThread(dead, 3, 4); 
                MyThread t3 = new MyThread(dead, 5, 6); 
                MyThread t4 = new MyThread(dead, 7, 8); 

                t1.start(); 
                t2.start(); 
                t3.start(); 
                t4.start(); 
        } 

} 

class MyThread extends Thread { 
        private DeadlockRisk dead; 
        private int a, b; 


        MyThread(DeadlockRisk dead, int a, int b) { 
                this.dead = dead; 
                this.a = a; 
                this.b = b; 
        } 

        @Override 
        public void run() { 
                dead.read(); 
                dead.write(a, b); 
        } 
} 

class DeadlockRisk { 
        private static class Resource { 
                public int value; 
        } 

        private Resource resourceA = new Resource(); 
        private Resource resourceB = new Resource(); 

        public int read() { 
                synchronized (resourceA) { 
                        System.out.println("read():" + Thread.currentThread().getName() + "獲取了resourceA的鎖!"); 
                        synchronized (resourceB) { 
                                System.out.println("read():" + Thread.currentThread().getName() + "獲取了resourceB的鎖渠旁!"); 
                                return resourceB.value + resourceA.value; 
                        } 
                } 
        } 

        public void write(int a, int b) { 
                synchronized (resourceB) { 
                        System.out.println("write():" + Thread.currentThread().getName() + "獲取了resourceA的鎖!"); 
                        synchronized (resourceA) { 
                                System.out.println("write():" + Thread.currentThread().getName() + "獲取了resourceB的鎖粤铭!"); 
                                resourceA.value = a; 
                                resourceB.value = b; 
                        } 
                } 
        } 
}
//運(yùn)行結(jié)果
read():Thread-0獲取了resourceA的鎖杂靶!
read():Thread-0獲取了resourceB的鎖!
write():Thread-0獲取了resourceA的鎖垛吗!
read():Thread-3獲取了resourceA的鎖烁登!

獲取線程dump

  1. jps獲得當(dāng)前Java虛擬機(jī)進(jìn)程的pid
    ? ~ jps
    657
    2564 Jps
    2525 AppMain
    2526 Launcher

  2. jstack打印堆棧
    Found one Java-level deadlock:
    =============================
    "Thread-3":
    waiting to lock monitor 0x00007fd5ca80c368 (object 0x00000007d56d1550, a deadlock.DeadlockRisk$Resource),
    which is held by "Thread-0"
    "Thread-0":
    waiting to lock monitor 0x00007fd5ca80ed58 (object 0x00000007d56d1540, a deadlock.DeadlockRisk$Resource),
    which is held by "Thread-3"

     Java stack information for the threads listed above:
     ===================================================
     "Thread-3":
             at deadlock.DeadlockRisk.read(Test.java:52)
             - waiting to lock <0x00000007d56d1550> (a deadlock.DeadlockRisk$Resource)
             - locked <0x00000007d56d1540> (a deadlock.DeadlockRisk$Resource)
             at deadlock.MyThread.run(Test.java:35)
     "Thread-0":
             at deadlock.DeadlockRisk.write(Test.java:62)
             - waiting to lock <0x00000007d56d1540> (a deadlock.DeadlockRisk$Resource)
             - locked <0x00000007d56d1550> (a deadlock.DeadlockRisk$Resource)
             at deadlock.MyThread.run(Test.java:36)
    
     Found 1 deadlock.
    

更多關(guān)于線程dump可以參考:http://my.oschina.net/u/161458/blog/266313

如何避免死鎖

  1. 避免一個線程同時獲取多個鎖饵沧。

  2. 避免一個線程在鎖內(nèi)同時占用多個資源,盡量保證每個鎖只占用一個資源羡儿。

  3. 嘗試使用定時鎖锁右,使用lock.tryLock(timeout)來替代使用內(nèi)部鎖機(jī)制讶泰。

  4. 對于數(shù)據(jù)庫鎖痪署,加鎖和解鎖必須在一個數(shù)據(jù)庫連接里,否則會出現(xiàn)解鎖失敗的情況狼犯。

活鎖

活鎖:馬路中間有條小橋领铐,只能容納一輛車經(jīng)過,橋兩頭開來兩輛車A和B瓢姻,A比較禮貌音诈,示意B先過,B也比較禮貌褥傍,示意A先過,結(jié)果兩人一直謙讓誰也過不去恍风。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朋贬,一起剝皮案震驚了整個濱河市窜骄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖鸥拧,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沟娱,居然都是意外死亡腕柜,警方通過查閱死者的電腦和手機(jī)矫废,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蓖扑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來台舱,“玉大人,你說我怎么就攤上這事柜去〔鹜穑” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵股耽,是天一觀的道長瞻颂。 經(jīng)常有香客問我,道長贡这,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任丽惭,我火速辦了婚禮责掏,結(jié)果婚禮上湃望,老公的妹妹穿的比我還像新娘。我一直安慰自己证芭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布叫潦。 她就那樣靜靜地躺著官硝,像睡著了一般短蜕。 火紅的嫁衣襯著肌膚如雪朋魔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天铺厨,我揣著相機(jī)與錄音解滓,去河邊找鬼。 笑死洼裤,一個胖子當(dāng)著我的面吹牛溪王,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莹菱,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼道伟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了祝懂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤砚蓬,失蹤者是張志新(化名)和其女友劉穎灰蛙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缕允,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年教届,在試婚紗的時候發(fā)現(xiàn)自己被綠了驾霜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粪糙。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡忿项,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出轩触,到底是詐尸還是另有隱情,我是刑警寧澤伐弹,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布榨为,位于F島的核電站,受9級特大地震影響随闺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜龄句,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一绰精、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卿樱,春花似錦、人聲如沸繁调。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裕寨。三九已至,卻和暖如春宾袜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背庆猫。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工月培, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杉畜。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像霍掺,于是被迫代替她去往敵國和親拌蜘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 背景 10月2號凌晨12:08收到報警兔魂,所有請求失敗举娩,處于完全不可用狀態(tài) 應(yīng)用服務(wù)器共四臺resin,resin之...
    AGIHunt閱讀 22,043評論 6 16
  • 概述 線程本身由于創(chuàng)建和切換的開銷智玻,采用多線程不會提高程序的執(zhí)行速度,反而會降低速度吊奢,但是對于頻繁IO操作的程序,...
    wustor閱讀 666評論 0 1
  • 20.1死鎖概念 由于競爭資源或者通信關(guān)系页滚,兩個或更多線程在執(zhí)行中出現(xiàn)铺呵,永遠(yuǎn)相互等待只能由其他進(jìn)程引發(fā)的事件 進(jìn)程...
    龜龜51閱讀 646評論 0 1
  • 1片挂、競態(tài)條件: 定義:競態(tài)條件指的是一種特殊的情況贞盯,在這種情況下各個執(zhí)行單元以一種沒有邏輯的順序執(zhí)行動作,從而導(dǎo)致...
    Hughman閱讀 1,298評論 0 7
  • 死鎖產(chǎn)生的原因和解鎖的方法 產(chǎn)生死鎖的四個必要條件: (1) 互斥條件:一個資源每次只能被一個進(jìn)程使用邻悬。 (2) ...
    憩在河岸上的魚丶閱讀 1,487評論 0 4