您好,登錄后才能下訂單哦!
這篇文章主要介紹Java多線程環境下如何實現死鎖,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
互斥:一次只有一個進程可以使用一個資源。其他進程不能訪問已分配給其他進程的資源。
不可搶占:不能搶占進程已占有的資源
請求和保持:當一個進程等待其他進程釋放資源時,繼續占有已經分配的資源
循環等待:存在一個封閉的進程鏈,使得每個進程至少占有此鏈中下一個進程所需要的一個資源。
注意:前三個條件都只是死鎖存在的必要條件,但不是充分條件。第四個條件是充分條件。以上條件同樣適用于線程。
/** * 死鎖產生的四個條件:互斥 請求和保持 不可搶占 循環等待 * synchronized鎖住對象資源,保證互斥和不可搶占 * 先持有一個資源,再去申請另一個資源->請求和保持 */ public class DeadLock { // 模擬兩個資源 public static Object lock1 = new Object(); public static Object lock2 = new Object(); // 先申請lock1資源,再去申請lock2資源 public static void getLock1First(){ synchronized (lock1){ System.out.println("getlock1"); getLock2(); } } public static void getLock2(){ synchronized (lock2) { System.out.println("lock1->lock2"); } } // 先申請lock2資源,再申請lock1資源 public static void getlock2First(){ synchronized (lock2){ System.out.println("getlock2"); getLock1(); } } public static void getLock1(){ synchronized (lock1){ System.out.println("lock2->lock1"); } } public static void main(String[] args) { new Thread(){ @Override public void run() { // 太難把控線程運行的時機了 也有可能此線程執行完了lock1->lock2的順序 // 直接死循環一直運行 // 總會剛好遇到線程1剛好獲得lock1,線程2剛好獲得lock2 while (true){ getLock1First(); } } }.start(); new Thread(){ @Override public void run() { while (true){ getlock2First(); } } }.start(); } }
死鎖:
先進入jdk安裝的bin目錄,啟動命令行,輸入命令jps查看運行的線程ID
死鎖檢測1:
執行jstack -l 線程ID命令
死鎖檢測2:
可以看到Thread-1
和Thread-2
都在相互等待對方持有的對象的monitor
鎖釋放。
以上是“Java多線程環境下如何實現死鎖”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。