多線程練習(xí)--死鎖

關(guān)于java的死鎖可能網(wǎng)上一大堆的代碼,作為初學(xué)者我覺得還是很有必要練習(xí)下敢订,親自實現(xiàn)王污,并分析其死鎖的原理。

死鎖的原因:

因為兩個或者多個進程互相需要對方手里的鎖而進入了一種互相等待的狀態(tài)楚午。代碼都是順序執(zhí)行的昭齐,所以不能倒退,也就沒有辦法交出手里的鎖矾柜,這是一個大的前提阱驾。

如何形成死鎖:

舉個兩個進程死鎖的例子。首先把沼,死鎖很重要的另一個前提就是鎖的唯一性啊易,我們都知道同步代碼塊需要傳遞一個對象吁伺,也就是我們說的鎖饮睬。兩個進程的死鎖需要兩把鎖,此時就須要保證這兩把鎖都是唯一性篮奄,也就需要兩把鎖都是靜態(tài)的對象捆愁,就像這樣:

class LockTemp {
    static final LockTemp l = new LockTemp ();
}

然后構(gòu)造兩個嵌套的同步代碼塊,如下代碼所示:

synchronized (LockA.lock) {
        System.out.println("進入外層同步代碼塊");
                synchronized (LockB.lock) {
                        System.out.println("進入內(nèi)層同步代碼塊");
        }
}

兩個代碼塊構(gòu)造完成后窟却,需要讓一個t1進程進入A嵌套代碼塊的外層昼丑,另一個t2進程進入B嵌套代碼塊的外層,此時t1需要的另一鎖在t2手上夸赫,t2需要的另一把鎖在t1手上菩帝,所以進入了一種互相等待的狀態(tài),而這種等待的狀態(tài)是沒有辦法結(jié)束的,所以程序進入了死鎖狀態(tài)呼奢。

完整的code:

package thread;

/*
 * java多線程死鎖的練習(xí) 
 */
public class LockDemo {
    public static void main(String[] args) {
        // 來兩個dead對象宜雀,一個為true,一個為false
        Dead d1 = new Dead(true);
        Dead d2 = new Dead(false);

        // 創(chuàng)建兩個進程對象并start
        Thread t1 = new Thread(d1);
        Thread t2 = new Thread(d2);
        t1.start();
        t2.start();
    }
}

// 先來兩把鎖
class LockA {
    static final LockA l = new LockA();
}

class LockB {
    static final LockB l = new LockB();
}

// 實現(xiàn)死鎖的類
class Dead implements Runnable {
    // 定義一個私有的boolean變量握础,來決定線程進入同步代碼的方向
    private boolean flag;

    public Dead(boolean flag) {
        this.flag = flag;
    }

    public void run() {

        while (true) {
            if (flag == true) {

                synchronized (LockA.l) {
                    System.out.println("if...A");
                    synchronized (LockB.l) {
                        System.out.println("if...B");
                    }
                }
            } else {
                synchronized (LockB.l) {
                    System.out.println("else...B");
                    synchronized (LockA.l) {
                        System.out.println("else...A");
                    }
                }
            }
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辐董,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子禀综,更是在濱河造成了極大的恐慌简烘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件定枷,死亡現(xiàn)場離奇詭異孤澎,居然都是意外死亡,警方通過查閱死者的電腦和手機欠窒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門亥至,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贱迟,你說我怎么就攤上這事姐扮。” “怎么了衣吠?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵茶敏,是天一觀的道長。 經(jīng)常有香客問我缚俏,道長惊搏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任忧换,我火速辦了婚禮恬惯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亚茬。我一直安慰自己酪耳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布刹缝。 她就那樣靜靜地躺著碗暗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梢夯。 梳的紋絲不亂的頭發(fā)上言疗,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音颂砸,去河邊找鬼噪奄。 笑死死姚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勤篮。 我是一名探鬼主播知允,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叙谨!你這毒婦竟也來了温鸽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤手负,失蹤者是張志新(化名)和其女友劉穎涤垫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竟终,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡蝠猬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了统捶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榆芦。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖喘鸟,靈堂內(nèi)的尸體忽然破棺而出匆绣,到底是詐尸還是另有隱情,我是刑警寧澤什黑,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布崎淳,位于F島的核電站,受9級特大地震影響愕把,放射性物質(zhì)發(fā)生泄漏拣凹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一恨豁、第九天 我趴在偏房一處隱蔽的房頂上張望嚣镜。 院中可真熱鬧,春花似錦橘蜜、人聲如沸菊匿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捧请。三九已至,卻和暖如春棒搜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背活箕。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工力麸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓克蚂,卻偏偏與公主長得像闺鲸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子埃叭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

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

  • 進程:正在執(zhí)行的程序摸恍,是一個動態(tài)的過程 線程:是進程中用于控制程序執(zhí)行的控制單元(執(zhí)行路徑,執(zhí)行情景) 進程中至少...
    寶塔山上的貓閱讀 442評論 0 1
  • 1赤屋、競態(tài)條件: 定義:競態(tài)條件指的是一種特殊的情況立镶,在這種情況下各個執(zhí)行單元以一種沒有邏輯的順序執(zhí)行動作,從而導(dǎo)致...
    Hughman閱讀 1,293評論 0 7
  • 知識點:一. 什么是線程: 進程是指運行中的應(yīng)用程序类早,每一個進程都有自己獨立的內(nèi)存空間媚媒。一個應(yīng)用程序可以同時啟動多...
    木有魚丸啦閱讀 650評論 0 0
  • 又來到了一個老生常談的問題,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢涩僻? 今天就這個問題開始缭召,來談?wù)劜?..
    tangsl閱讀 4,129評論 0 23
  • 工作漸漸步入正軌,前一個項目完成之后有點小松懈逆日,每天正常的上下班讓我有些不適應(yīng)嵌巷。某個毫無新意的手游在我一周游之后,...
    耗子小王閱讀 62評論 0 0