本篇內(nèi)容介紹了“什么是線程死鎖”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
目前創(chuàng)新互聯(lián)已為成百上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、黔江網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
死鎖定義 死鎖產(chǎn)生的條件 死鎖示例 如何避免死鎖
● 死鎖是指兩個或兩個以上的線程在執(zhí)行過程中,因爭奪資源而造成互相等待的現(xiàn)象, 在無外力作用的情況下,這些線程會一直相互等待而無法繼續(xù)運(yùn)行下去
● 互斥條件:指線程對已經(jīng)獲取到的資源進(jìn)行排它性使用,即該資源同時只由一個線程占用。 如果此時還有其他線程請求獲取該資源,則請求者只能等待,直至占有資源的線程釋放該資源。 ● 請求并持有條件:指一個線程已經(jīng)持有了至少一個資源,但又提出了新的資源請求,而新資源已被其他線程占有, 所以當(dāng)前線程會被阻塞,但阻塞的同時并不釋放自己已經(jīng)獲取的資源。 ● 不可剝奪條件:指線程獲取到的資源在自己使用完之前不能被其他線程搶占,只有在自己使用完畢后才由自己釋放該資源。 ● 環(huán)路等待條件:指在發(fā)生死鎖時,必然存在一個線程—資源的環(huán)形鏈,即線程集合{T0, T1, T2, …, Tn}中的T0正在 等待一個T1占用的資源,T1正在等待T2占用的資源,……Tn正在等待已被T0占用的資源。
package com.pimee.thread.deadlock; /** * 線程死鎖示例 */ public class DeadLock { private static Object resourceA = new Object(); private static Object resourceB = new Object(); public static void main(String[] args) { Thread threadA = new Thread(new Runnable() { [@Override](https://my.oschina.net/u/1162528) public void run() { synchronized (resourceA){ System.out.println(Thread.currentThread().getName() + "get resourceA"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " is waiting for resourceB"); synchronized (resourceB){ System.out.println(Thread.currentThread().getName() + " get resourceB"); } } } }); Thread threadB = new Thread(new Runnable() { [@Override](https://my.oschina.net/u/1162528) public void run() { synchronized (resourceB){ System.out.println(Thread.currentThread().getName() + " get resourceB"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " is waiting for resourceA"); synchronized (resourceA){ System.out.println(Thread.currentThread().getName() + " get resourceA"); } } } }); threadA.start(); threadB.start(); } }
● 加鎖順序:線程按照相同的順序加鎖。 ● 加鎖時限,線程獲取鎖的過程中限制一定的時間,如果給定時間內(nèi)獲取不到,就算了,別勉強(qiáng)自己。這需要用到Lock的一些API
上面死鎖的demo,修改一下加鎖的書序,可以解決問題
package com.pimee.thread.deadlock; /** * 線程死鎖示例 */ public class DeadLock { private static Object resourceA = new Object(); private static Object resourceB = new Object(); public static void main(String[] args) { Thread threadA = new Thread(new Runnable() { @Override public void run() { synchronized (resourceA){ System.out.println(Thread.currentThread().getName() + " get resourceA"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " is waiting for resourceB"); synchronized (resourceB){ System.out.println(Thread.currentThread().getName() + " get resourceB"); } } } }); Thread threadB = new Thread(new Runnable() { @Override public void run() { synchronized (resourceA){ System.out.println(Thread.currentThread().getName() + " get resourceA"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " is waiting for resourceA"); synchronized (resourceB){ System.out.println(Thread.currentThread().getName() + " get resourceB"); } } } }); threadA.start(); threadB.start(); } }
可以使用jstatck查看jvm日志,你會發(fā)現(xiàn)以下結(jié)果:
“什么是線程死鎖”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
新聞名稱:什么是線程死鎖
當(dāng)前鏈接:http://aaarwkj.com/article16/pcsodg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、響應(yīng)式網(wǎng)站、定制開發(fā)、商城網(wǎng)站、企業(yè)網(wǎng)站制作、域名注冊
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)