av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

為了讓小白也能看懂這個死鎖Case,我請來了小黑...

小黑有點困,他想休息,又怕耽誤時間,于是準備小瞇一會。

網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、小程序設計、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了寧蒗免費建站歡迎大家使用!

為了能按時起來,他設了鬧鐘,作為程序員,必須得整兩個,防止單點故障。

當任意一個鬧鐘響起,小黑就起來把兩個鬧鐘都關掉,繼續(xù)干活,就像這樣:

public class Clock {
    private BlackBro blackBro;

    public void setBlackBro(BlackBro blackBro) {
        this.blackBro = blackBro;
    }

    public synchronized void ring() {
        System.out.println(Thread.currentThread() + " Clock.ring...");
        blackBro.wake();
    }

    public synchronized void close() {
        System.out.println(Thread.currentThread() + " Clock.close...");
    }
}
public class BlackBro {
    private Clock[] clocks;

    public void setClocks(Clock[] clocks) {
        this.clocks = clocks;
    }

    public synchronized void wake() {
        System.out.println(Thread.currentThread() + "BlackBro.wake...");
        for (Clock clock : clocks) {
            clock.close();
        }
    }
}

為了防止鬧鐘和小黑在執(zhí)行操作期間被人打擾,我貼心地給他們都加上了鎖 —— synchronized。

模擬這個場景將是這樣:

public static void main(String[] args) {
    Clock clock1 = new Clock();
    Clock clock2 = new Clock();
    BlackBro blackBro = new BlackBro();

    clock1.setBlackBro(blackBro);
    clock2.setBlackBro(blackBro);
    blackBro.setClocks(new Clock[]{clock1, clock2});

    // sleep...
    Thread t1 = new Thread(clock1::ring);
    Thread t2 = new Thread(clock2::ring);

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

啟動程序發(fā)現(xiàn),陷入了無盡地等待:

Thread[Thread-0,5,main] Clock.ring...
Thread[Thread-1,5,main] Clock.ring...
Thread[Thread-1,5,main]BlackBro.wake...

這是怎么回事?眼尖的同學肯定發(fā)現(xiàn)問題了。我們看一下 jstack:

Found one Java-level deadlock:
=============================
"Thread-0":
  waiting to lock monitor 0x0000600003ecc000 (object 0x000000070fc52398, a com.demo.BlackBro),
  which is held by "Thread-1"

"Thread-1":
  waiting to lock monitor 0x0000600003ec04e0 (object 0x000000070fc50f88, a com.demo.Clock),
  which is held by "Thread-0"

Java stack information for the threads listed above:
===================================================

原來是死鎖了:我們起了兩個鬧鐘線程,兩個線程各自拿到自己的對象鎖,開始 ring,ring 又都會去喚醒小黑,但小黑對象只有一個,只有一個鬧鐘能順利拿到小黑的對象鎖,小黑被喚醒后又去關鬧鐘,但卻沒法關掉,因為鬧鐘在等小黑喚醒的期間不會被別人打斷,于是鬧鐘在等小黑,小黑在等鬧鐘,形成了死鎖。

我相信稍微仔細點大家都能發(fā)現(xiàn)這個問題,這是因為我把干擾項都排除,只留下非常簡單的框架。如果在一個非常復雜的系統(tǒng)中,還是很難發(fā)現(xiàn)的。這也是我今天遇到的一個線上問題,花了半天時間才排查出來。

這個 case 教育我們要謹慎使用鎖,尤其是 synchronized;其次如果發(fā)現(xiàn)程序沒有按預期地執(zhí)行,尤其是該執(zhí)行的沒執(zhí)行,可以留個心眼,看看堆棧是不是有死鎖。

2024 年第一個小case送給你,你學廢了嗎?


新聞標題:為了讓小白也能看懂這個死鎖Case,我請來了小黑...
網(wǎng)頁路徑:http://uogjgqi.cn/article/cdeiggd.html
掃二維碼與項目經(jīng)理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流