91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java多線程環境下如何實現死鎖

發布時間:2021-12-13 09:08:57 來源:億速云 閱讀:156 作者:小新 欄目:開發技術

這篇文章主要介紹Java多線程環境下如何實現死鎖,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

1、死鎖產生的條件

  • 互斥:一次只有一個進程可以使用一個資源。其他進程不能訪問已分配給其他進程的資源。

  • 不可搶占:不能搶占進程已占有的資源

  • 請求和保持:當一個進程等待其他進程釋放資源時,繼續占有已經分配的資源

  • 循環等待:存在一個封閉的進程鏈,使得每個進程至少占有此鏈中下一個進程所需要的一個資源。

注意:前三個條件都只是死鎖存在的必要條件,但不是充分條件。第四個條件是充分條件。以上條件同樣適用于線程。

2、模擬多線程環境下死鎖的產生

/**
 * 死鎖產生的四個條件:互斥 請求和保持 不可搶占 循環等待
 * 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();
    }
}

死鎖:

Java多線程環境下如何實現死鎖

3、死鎖的排查

先進入jdk安裝的bin目錄,啟動命令行,輸入命令jps查看運行的線程ID

死鎖檢測1:

Java多線程環境下如何實現死鎖

執行jstack -l 線程ID命令

死鎖檢測2:

Java多線程環境下如何實現死鎖

可以看到Thread-1Thread-2都在相互等待對方持有的對象的monitor鎖釋放。

以上是“Java多線程環境下如何實現死鎖”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

九江市| 莱芜市| 淮南市| 乐都县| 台州市| 仁怀市| 疏附县| 伽师县| 扶风县| 宁陕县| 鄄城县| 襄樊市| 吉林市| 宜昌市| 千阳县| 阿巴嘎旗| 宁阳县| 玉树县| 尚志市| 彩票| 巩义市| 张家口市| 吉首市| 兴仁县| 札达县| 积石山| 合山市| 浪卡子县| 鸡泽县| 垣曲县| 达拉特旗| 汶上县| 鹤岗市| 洛南县| 定远县| 阳原县| 蒲城县| 北宁市| 秭归县| 泸西县| 江都市|