首頁 > Java > java教程 > 主體

Java中死鎖的概念及解決方法

零下一度
發布: 2017-07-20 13:41:31
原創
2810 人瀏覽過

1.進程死鎖及解決方法

 一、要點提示

(1) 掌握死鎖的概念和產生死鎖的根本原因。

(2) 理解產生死鎖的必要條件--以下四個條件同時具備:互斥條件、不可搶佔條件、佔有且申請條件、循環等待條件。

(3) 記得解決死鎖的一般方法,掌握死鎖的預防和死鎖的避免二者的基本思想。

(4) 掌握死鎖的預防策略中資源有順序分配策略。

(5) 瞭解進程安全序列的概念,瞭解死鎖與安全序列的關係。

(6) 了解銀行家演算法。

(7) 了解資源分配圖。

(8) 了解死鎖的偵測及恢復的想法。

2.關於死鎖,我個人的理解:

經過一段時間的學習,我理解的死鎖概念就是,例如有兩段進程,每一個進程中都被兩把鎖(鎖1、鎖2),鎖著。不同的是,在兩段進程中,鎖的應用位置不同。從而產生了,一個進程的完整啟動,內部需要一把鎖,而這把鎖又恰好在另一個進程那裡。另一個行程想要完整啟動(或執行)內部所需要的那把鎖又在另一個程式裡。這樣互相牽絆著,都處於準備狀態卻無法向下執行。造成了死鎖狀態。我根據理解畫了示意圖:

 

3.關於死鎖的一段簡單程式碼:
public class Test15 {public static void main(String[] args) throws InterruptedException {new Thread(new DeadLockThread(true)).start();//Thread.sleep(10);在中间用上它可以使结果交替出现,我是为了看死锁的效果,用它对比一下。new Thread(new DeadLockThread(false)).start();
    }
}class DeadLockThread implements Runnable {static Object o1 = new Object();static Object o2 = new Object();private boolean flag;

    DeadLockThread(boolean flag) {this.flag = flag;
    }public void run() {if (flag == true) {while (true) {synchronized (o1) {
                    System.out.println("这是锁o1");synchronized (o2) {
                        System.out.println("这是锁o2");
                    }
登入後複製

列印結果:

4.補充:
關於死鎖,我找了一些資料,感覺這裡的問題蠻複雜。現階段僅了解這些簡單原理。也能大致了解到死鎖發生必須具備一定的四個條件。
1)互斥條件:
指處理程序對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個程序佔用。如果此時還有其它進程請求資源,則請求者只能等待,直至佔有資源的程序用畢釋放。
2)請求與保持條件:
指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程佔有,此時請求進程阻塞,但又對自己已獲得的其它資源保持不放。
3)不剝奪條件:
指進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。
4)環路等待條件:
指在發生死鎖時,必然存在一個進程-資源的環形鏈,即進程集合{P0,P1,P2,··· ,Pn}中的P0正在等待一個P1所佔用的資源;P1正在等待P2佔用的資源,…,Pn正在等待已被P0佔用的資源。
附:
1)呼叫sleep()方法,並不會讓執行緒釋放它所持有的同步鎖定;而且在這期間它也不會阻礙其它執行緒的運行
2)呼叫wait()方法,目前執行的執行緒就會轉入等待狀態,等待別的執行緒再次呼叫這個物件的notify()或notifyAll()方法喚醒它,或者到了指定的等待時間,線程自動醒來。
如果執行緒擁有某個或某些物件的同步鎖,那麼在呼叫了wait()後,這個執行緒就會釋放它所持有的所有同步資源,而不限於這個被呼叫了wait( )方法的對象。
3)在實際開發中,死鎖一般隱藏的較深,不容易被發現,一旦死鎖現象發生,就必然會導致程式的癱瘓。因此必須避免它的發生。

以上是Java中死鎖的概念及解決方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!