日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

為了讓小白也能看懂這個(gè)死鎖Case,我請(qǐng)來了小黑...

來源: 責(zé)編: 時(shí)間:2024-01-19 09:16:51 260觀看
導(dǎo)讀小黑有點(diǎn)困,他想休息,又怕耽誤時(shí)間,于是準(zhǔn)備小瞇一會(huì)。為了能按時(shí)起來,他設(shè)了鬧鐘,作為程序員,必須得整兩個(gè),防止單點(diǎn)故障。當(dāng)任意一個(gè)鬧鐘響起,小黑就起來把兩個(gè)鬧鐘都關(guān)掉,繼續(xù)干活,就像這樣:public class Clock { private

小黑有點(diǎn)困,他想休息,又怕耽誤時(shí)間,于是準(zhǔn)備小瞇一會(huì)。Qfh28資訊網(wǎng)——每日最新資訊28at.com

為了能按時(shí)起來,他設(shè)了鬧鐘,作為程序員,必須得整兩個(gè),防止單點(diǎn)故障。Qfh28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)任意一個(gè)鬧鐘響起,小黑就起來把兩個(gè)鬧鐘都關(guān)掉,繼續(xù)干活,就像這樣:Qfh28資訊網(wǎng)——每日最新資訊28at.com

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。Qfh28資訊網(wǎng)——每日最新資訊28at.com

模擬這個(gè)場(chǎng)景將是這樣:Qfh28資訊網(wǎng)——每日最新資訊28at.com

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

啟動(dòng)程序發(fā)現(xiàn),陷入了無盡地等待:Qfh28資訊網(wǎng)——每日最新資訊28at.com

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:Qfh28資訊網(wǎng)——每日最新資訊28at.com

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:===================================================

原來是死鎖了:我們起了兩個(gè)鬧鐘線程,兩個(gè)線程各自拿到自己的對(duì)象鎖,開始 ring,ring 又都會(huì)去喚醒小黑,但小黑對(duì)象只有一個(gè),只有一個(gè)鬧鐘能順利拿到小黑的對(duì)象鎖,小黑被喚醒后又去關(guān)鬧鐘,但卻沒法關(guān)掉,因?yàn)轸[鐘在等小黑喚醒的期間不會(huì)被別人打斷,于是鬧鐘在等小黑,小黑在等鬧鐘,形成了死鎖。Qfh28資訊網(wǎng)——每日最新資訊28at.com

我相信稍微仔細(xì)點(diǎn)大家都能發(fā)現(xiàn)這個(gè)問題,這是因?yàn)槲野迅蓴_項(xiàng)都排除,只留下非常簡(jiǎn)單的框架。如果在一個(gè)非常復(fù)雜的系統(tǒng)中,還是很難發(fā)現(xiàn)的。這也是我今天遇到的一個(gè)線上問題,花了半天時(shí)間才排查出來。Qfh28資訊網(wǎng)——每日最新資訊28at.com

這個(gè) case 教育我們要謹(jǐn)慎使用鎖,尤其是 synchronized;其次如果發(fā)現(xiàn)程序沒有按預(yù)期地執(zhí)行,尤其是該執(zhí)行的沒執(zhí)行,可以留個(gè)心眼,看看堆棧是不是有死鎖。Qfh28資訊網(wǎng)——每日最新資訊28at.com

2024 年第一個(gè)小case送給你,你學(xué)廢了嗎?Qfh28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-64969-0.html為了讓小白也能看懂這個(gè)死鎖Case,我請(qǐng)來了小黑...

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Java死鎖,你學(xué)會(huì)了嗎?

下一篇: 分享六個(gè)實(shí)用的 JS 小技巧,讓你的代碼顯得更專業(yè)些

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 石頭自清潔掃拖機(jī)器人G10S評(píng)測(cè):多年黑科技集大成之作 懶人終極福音

    科技圈經(jīng)常能看到一個(gè)詞叫“縫合怪”,用來形容那些把好多功能或者外觀結(jié)合在一起的產(chǎn)品,通常這樣的詞是貶義詞,但如果真的是產(chǎn)品縫合的好、縫合的實(shí)用的話,那它就成了中性詞,今
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優(yōu)化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實(shí)現(xiàn)了一個(gè)流處理程序
  • 一文看懂為蘋果Vision Pro開發(fā)應(yīng)用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現(xiàn)實(shí)(MR)頭戴設(shè)備。Vision Pro結(jié)合了虛擬現(xiàn)實(shí)(VR)和增強(qiáng)現(xiàn)實(shí)(AR)的沉浸感。其高分辨率顯示屏、先進(jìn)的傳感器和強(qiáng)大的處理能力
  • 不容錯(cuò)過的MSBuild技巧,必備用法詳解和實(shí)踐指南

    一、MSBuild簡(jiǎn)介MSBuild是一種基于XML的構(gòu)建引擎,用于在.NET Framework和.NET Core應(yīng)用程序中自動(dòng)化構(gòu)建過程。它是Visual Studio的構(gòu)建引擎,可在命令行或其他構(gòu)建工具中使用
  • JavaScript學(xué)習(xí) -AES加密算法

    引言在當(dāng)今數(shù)字化時(shí)代,前端應(yīng)用程序扮演著重要角色,用戶的敏感數(shù)據(jù)經(jīng)常在前端進(jìn)行加密和解密操作。然而,這樣的操作在網(wǎng)絡(luò)傳輸和存儲(chǔ)中可能會(huì)受到惡意攻擊的威脅。為了確保數(shù)據(jù)
  • 自動(dòng)化在DevOps中的力量:簡(jiǎn)化軟件開發(fā)和交付

    自動(dòng)化在DevOps中扮演著重要角色,它提升了DevOps的效能。通過自動(dòng)化工具和方法,DevOps團(tuán)隊(duì)可以實(shí)現(xiàn)以下目標(biāo):消除手動(dòng)和重復(fù)性任務(wù)。簡(jiǎn)化流程。在整個(gè)軟件開發(fā)生命周期中實(shí)現(xiàn)更
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預(yù)警不絕,但處于厄爾尼諾大“烤”之下的除了眾生,還有各大企業(yè)發(fā)布的ESG報(bào)告。ESG是“環(huán)境保
  • 三星Galaxy Z Fold/Flip 5國行售價(jià)曝光 :最低7499元/12999元起

    據(jù)官方此前宣布,三星將于7月26日也就是明天在韓國首爾舉辦Unpacked活動(dòng),屆時(shí)將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • 滴滴違法違規(guī)被罰80.26億 共存在16項(xiàng)違法事實(shí)

    滴滴違法違規(guī)被罰80.26億 存在16項(xiàng)違法事實(shí)開始于2121年7月,歷經(jīng)一年時(shí)間,網(wǎng)絡(luò)安全審查辦公室對(duì)“滴滴出行”網(wǎng)絡(luò)安全審查終于有了一個(gè)暫時(shí)的結(jié)束。據(jù)“網(wǎng)信
Top 主站蜘蛛池模板: 广平县| 磴口县| 阳谷县| 乡宁县| 迁安市| 克东县| 通江县| 汽车| 华容县| 华池县| 新沂市| 新龙县| 刚察县| 应用必备| 舞阳县| 朝阳县| 明溪县| 甘泉县| 大洼县| 耒阳市| 古丈县| 仁化县| 百色市| 临高县| 禹州市| 无为县| 钟山县| 漳平市| 旬邑县| 海原县| 乳山市| 通城县| 五华县| 罗平县| 九台市| 屏东县| 长乐市| 泉州市| 福贡县| 北票市| 璧山县|