久久综合九色综合97婷婷-美女视频黄频a免费-精品日本一区二区三区在线观看-日韩中文无码有码免费视频-亚洲中文字幕无码专区-扒开双腿疯狂进出爽爽爽动态照片-国产乱理伦片在线观看夜-高清极品美女毛茸茸-欧美寡妇性猛交XXX-国产亚洲精品99在线播放-日韩美女毛片又爽又大毛片,99久久久无码国产精品9,国产成a人片在线观看视频下载,欧美疯狂xxxx吞精视频

有趣生活

當(dāng)前位置:首頁(yè)>職場(chǎng)>面試死亡問(wèn)題有哪些(面試官什么是死鎖)

面試死亡問(wèn)題有哪些(面試官什么是死鎖)

發(fā)布時(shí)間:2024-01-19閱讀(19)

導(dǎo)讀目錄什么是死鎖?死鎖產(chǎn)生原因?如何使用IDEA查看程序是否產(chǎn)生死鎖?如何避免死鎖?什么是死鎖?死鎖是一種非常嚴(yán)重的bug,是說(shuō)多個(gè)線程同時(shí)被阻塞,線程中的一....

目錄

什么是死鎖?

死鎖產(chǎn)生原因?

如何使用IDEA查看程序是否產(chǎn)生死鎖?

如何避免死鎖?

什么是死鎖?

死鎖是一種非常嚴(yán)重的bug,是說(shuō)多個(gè)線程同時(shí)被阻塞,線程中的一個(gè)或者多個(gè)又或者全部都在等待某個(gè)資源被釋放,造成線程無(wú)限期的阻塞,導(dǎo)致程序不能正常終止

?為了進(jìn)一步說(shuō)明死鎖,有哲學(xué)家就餐這樣的一個(gè)問(wèn)題:

有一個(gè)桌子,哲學(xué)家們圍成一圈,每?jī)蓚€(gè)哲學(xué)家中間有一支筷子

面試死亡問(wèn)題有哪些(面試官什么是死鎖)(1)

哲學(xué)家只能兩件事:思考或者吃飯,思考時(shí)候就不會(huì)動(dòng)筷子,吃飯時(shí)會(huì)拿起左右手旁邊的筷子(先拿左后拿右)

面試死亡問(wèn)題有哪些(面試官什么是死鎖)(2)

如果有一個(gè)哲學(xué)家想吃飯,但是筷子被占用,就得等別人吃完進(jìn)入思考后,才能獲得筷子,等待的過(guò)程稱(chēng)為阻塞等待

面試死亡問(wèn)題有哪些(面試官什么是死鎖)(3)

在等待的情形中,會(huì)出現(xiàn)下面這樣一種情況:所有人都處于等待筷子中,即所有哲學(xué)家都獲取到左邊的筷子,一直獲取不到右邊的筷子,這種情況稱(chēng)為死鎖

面試死亡問(wèn)題有哪些(面試官什么是死鎖)(4)

死鎖產(chǎn)生原因?

結(jié)合上述哲學(xué)家的例子,說(shuō)明死鎖產(chǎn)生的四個(gè)必要條件:

互斥使用:當(dāng)資源被一個(gè)線程使用或者占用時(shí),別的線程不能使用該資源

不可搶占:獲取資源的一方,不能從正在使用資源的一方搶占掠奪資源,資源只能被使用者主動(dòng)釋放

請(qǐng)求和保持:資源請(qǐng)求者在請(qǐng)求別的資源時(shí),同時(shí)保持對(duì)已有資源的占有

循環(huán)等待:即p1占有p2的資源,p2占有p3的資源,p3占有p1的資源,這樣形成了一個(gè)等待環(huán)路

上述這四個(gè)條件滿(mǎn)足即造成的結(jié)果就是死鎖

?看這樣的一段可能產(chǎn)生死鎖的代碼:

public class DeadLock {public static void main(String[] args) {Object lock1 = new Object();Object lock2 = new Object();Thread t1 = new Thread(){@Overridepublic void run() {try {synchronized (lock1){Thread.sleep(1000);synchronized (lock2){System.out.println("輸出t1");}}} catch (InterruptedException e) {e.printStackTrace();}}};Thread t2 = new Thread(){@Overridepublic void run() {try {synchronized (lock2){Thread.sleep(1000);synchronized (lock1){System.out.println("輸出t2");}}} catch (InterruptedException e) {e.printStackTrace();}}};t1.start();t2.start();}}

??說(shuō)明:

t1先申請(qǐng)lock1,lock2,釋放lock2,lock1

t2后申請(qǐng)lock2,lock1,釋放lock1,lock2

這種情況不會(huì)產(chǎn)生死鎖

t2先申請(qǐng)lock2,lock1,釋放lock1,lock2

t1后申請(qǐng)lock1,lock2,釋放lock2,lock1

這種情況也不會(huì)產(chǎn)生死鎖

t1申請(qǐng)到lock1,t2申請(qǐng)到lock2,這樣t1就申請(qǐng)不到lock2,t2就申請(qǐng)不到lock1,都等著對(duì)方釋放資源,這樣就產(chǎn)生了死鎖

因?yàn)樽宼1,t2申請(qǐng)第一個(gè)鎖的時(shí)候都等待了1秒,所以產(chǎn)生死鎖的概率接近100%

運(yùn)行結(jié)果:沒(méi)有執(zhí)行輸出,產(chǎn)生死鎖

面試死亡問(wèn)題有哪些(面試官什么是死鎖)(5)

如何使用IDEA查看程序是否產(chǎn)生死鎖?

第一步:點(diǎn)擊下方紅圈內(nèi)的Terminal

面試死亡問(wèn)題有哪些(面試官什么是死鎖)(6)

第二步:在下方命令窗口輸入jconsole,然后回車(chē)

面試死亡問(wèn)題有哪些(面試官什么是死鎖)(7)

第三步:雙擊發(fā)生死鎖對(duì)應(yīng)的類(lèi)

面試死亡問(wèn)題有哪些(面試官什么是死鎖)(8)

第四步:切換到線程,點(diǎn)擊下面的檢查死鎖

面試死亡問(wèn)題有哪些(面試官什么是死鎖)(9)

第五步:即可看到發(fā)生死鎖的線程

面試死亡問(wèn)題有哪些(面試官什么是死鎖)(10)

如何避免死鎖?

死鎖的產(chǎn)生必須滿(mǎn)足互斥使用,不可搶占,請(qǐng)求和保持,循環(huán)等待這四個(gè)條件,但是只要破壞其中任意一個(gè)條件即可破壞死鎖,其中最容易破壞的就是循環(huán)等待這個(gè)條件,那么如何破壞循環(huán)等待這個(gè)條件呢?

多個(gè)線程約定好一定的順序,按照這個(gè)順序加鎖釋放鎖

?對(duì)上述產(chǎn)生死鎖的代碼改造:將加鎖順序都改為lock1,lock2,看看打印結(jié)果

public class DeadLock {public static void main(String[] args) {Object lock1 = new Object();Object lock2 = new Object();Thread t1 = new Thread(){@Overridepublic void run() {try {synchronized (lock1){Thread.sleep(1000);synchronized (lock2){System.out.println("輸出t1");}}} catch (InterruptedException e) {e.printStackTrace();}}};Thread t2 = new Thread(){@Overridepublic void run() {try {synchronized (lock1){Thread.sleep(1000);synchronized (lock2){System.out.println("輸出t2");}}} catch (InterruptedException e) {e.printStackTrace();}}};t1.start();t2.start();}}

打印結(jié)果:可以看到結(jié)果可以正常輸出而不產(chǎn)生死鎖

面試死亡問(wèn)題有哪些(面試官什么是死鎖)(11)

小伙伴們有興趣想了解內(nèi)容和更多相關(guān)學(xué)習(xí)資料的請(qǐng)點(diǎn)贊收藏 評(píng)論轉(zhuǎn)發(fā) 關(guān)注我,后面會(huì)有很多干貨。我有一些面試題、架構(gòu)、設(shè)計(jì)類(lèi)資料可以說(shuō)是程序員面試必備!所有資料都整理到網(wǎng)盤(pán)了,需要的話歡迎下載!私信我回復(fù)【111】即可免費(fèi)獲取

面試死亡問(wèn)題有哪些(面試官什么是死鎖)(12)

版權(quán)聲明:本文為CSDN博主「Java猿~」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/qq_58710208/article/details/124131865

歡迎分享轉(zhuǎn)載→http://m.avcorse.com/read-32449.html

相關(guān)文章

    Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號(hào)-5 TXT地圖HTML地圖XML地圖