成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

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

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();
        }
    }
}

為了防止鬧鐘和小黑在執行操作期間被人打擾,我貼心地給他們都加上了鎖 —— 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();
}

啟動程序發現,陷入了無盡地等待:

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

這是怎么回事?眼尖的同學肯定發現問題了。我們看一下 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 又都會去喚醒小黑,但小黑對象只有一個,只有一個鬧鐘能順利拿到小黑的對象鎖,小黑被喚醒后又去關鬧鐘,但卻沒法關掉,因為鬧鐘在等小黑喚醒的期間不會被別人打斷,于是鬧鐘在等小黑,小黑在等鬧鐘,形成了死鎖。

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

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

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

責任編輯:武曉燕 來源: 捉蟲大師
相關推薦

2017-02-22 15:04:52

2024-11-01 05:10:00

2021-11-01 15:15:37

Context項目代碼

2019-12-27 09:47:05

大數據TomcatWeb

2018-12-24 08:46:52

Kubernetes對象模型

2019-11-04 13:09:43

數據平臺架構

2019-10-10 11:10:04

SpringBoot異步編程

2022-10-11 08:27:45

Spring事務管理性能統計

2019-11-18 10:38:03

線程池Java框架

2020-02-15 17:16:05

Kubernetes容器

2013-09-22 10:34:08

碼農機器學習算法

2019-03-26 11:15:34

AI機器學習人工智能

2020-03-31 10:36:07

數據平臺架構

2018-05-16 10:07:02

監控報警系統

2020-11-16 16:38:30

人工智能AI

2013-03-15 10:35:17

編程語言編程笑話

2022-12-27 16:31:22

AI繪圖軟件

2017-11-02 12:08:56

2018-03-06 10:38:23

云計算大數據人工智能

2025-02-17 10:09:54

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲性网 | 作爱视频免费观看 | 国产区在线观看 | 九九成人| 91精品国产综合久久久动漫日韩 | 亚欧精品| 精品久久久久久亚洲综合网 | 中文字幕一区二区三区乱码图片 | 天天色图 | 亚洲国产精品一区二区三区 | 日韩成人在线播放 | 中文字幕视频在线看5 | 少妇淫片aaaaa毛片叫床爽 | 精品久久免费 | 国产高清在线精品 | 久久精品久久综合 | 国产精品久久久久久久久久久久久 | 国内自拍视频在线观看 | 亚洲欧美bt| 91资源在线观看 | 另类专区亚洲 | 欧美一区精品 | 亚洲成人在线视频播放 | 日韩一区二区在线观看 | 成人免费福利 | 亚洲精品福利在线 | 欧美三区| 亚洲协和影视 | 日韩av在线播 | 亚洲精品久久久久久久久久久 | 久久综合久 | 波多野结衣在线观看一区二区三区 | 欧美激情综合色综合啪啪五月 | 三级免费网 | 自拍偷拍第一页 | 国产一区二区三区在线看 | 亚洲第一av| 奇米超碰在线 | 国产在线一区二区三区 | 精品欧美一区二区三区 | 成人高清在线 |