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

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

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

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

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

當(dāng)任意一個鬧鐘響起,小黑就起來把兩個鬧鐘都關(guā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...

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

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

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

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

責(zé)任編輯:武曉燕 來源: 捉蟲大師
相關(guān)推薦

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

大數(shù)據(jù)TomcatWeb

2018-12-24 08:46:52

Kubernetes對象模型

2019-11-04 13:09:43

數(shù)據(jù)平臺架構(gòu)

2019-11-18 10:38:03

線程池Java框架

2020-02-15 17:16:05

Kubernetes容器

2022-10-11 08:27:45

Spring事務(wù)管理性能統(tǒng)計

2019-10-10 11:10:04

SpringBoot異步編程

2019-03-26 11:15:34

AI機器學(xué)習(xí)人工智能

2013-09-22 10:34:08

碼農(nóng)機器學(xué)習(xí)算法

2020-03-31 10:36:07

數(shù)據(jù)平臺架構(gòu)

2013-03-15 10:35:17

編程語言編程笑話

2018-05-16 10:07:02

監(jiān)控報警系統(tǒng)

2020-11-16 16:38:30

人工智能AI

2022-12-27 16:31:22

AI繪圖軟件

2018-03-06 10:38:23

云計算大數(shù)據(jù)人工智能

2017-11-02 12:08:56

2025-02-17 10:09:54

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久久久久久久国产 | 国产精品1区2区 | 亚洲一页| 五月婷婷丁香 | 亚洲三区在线 | 日本色综合 | 黄在线| 麻豆国产一区二区三区四区 | 精品国产一区二区三区性色 | 国产一区二区激情视频 | 91久久久久久久久久久久久 | 亚洲一区二区黄 | 免费在线黄 | 欧美精品欧美精品系列 | 久精品久久 | 日韩黄a| 蜜桃久久 | av日韩在线播放 | 欧美精品久久久久 | 一区二区亚洲 | 国产精品一区二区日韩 | 亚洲国产精品久久久久婷婷老年 | 中文字幕一区二区三区精彩视频 | 亚洲精品二三区 | 国产一区久久 | 亚洲一区二区精品 | 亚洲一区二区三区在线 | 黑人久久 | 国产91久久久久 | 精品国产鲁一鲁一区二区张丽 | 免费一级毛片 | 日本黄色一级视频 | 日本中文字幕一区 | 性生生活大片免费看视频 | 91精品久久久久久久久 | 日韩一区二区在线视频 | 国产一区二区视频在线 | 国产一区二区三区色淫影院 | 中文字幕第5页 | 久久99精品国产自在现线小黄鸭 | 黄色片网站国产 |