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

溫馨提示×

溫馨提示×

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

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

Java項目中多個線程怎么查找死鎖

發布時間:2021-05-11 14:47:55 來源:億速云 閱讀:171 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關Java項目中多個線程怎么查找死鎖,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

Java的特點有哪些

Java的特點有哪些 1.Java語言作為靜態面向對象編程語言的代表,實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程。 2.Java具有簡單性、面向對象、分布式、安全性、平臺獨立與可移植性、動態性等特點。 3.使用Java可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等。

當項目中有多個線程,如何查找死鎖?

1.編譯環境

IDEA 2020 ,windows10, jdk8及以上版本

一、死鎖是什么?

死鎖指A線程想使用資源但是被B線程占用了,B線程線程想使用資源被A線程占用了,導致程序無法繼續下去了。

1.1 死鎖的例子;

public class Deadlock {
    public static void main(String[] args) {
        Object lock1 = new Object();
        Object lock2 = new Object();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock1){
                    System.out.println("線程一得到了lock1");
                    try{
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("線程一獲取lock2");
                    synchronized (lock2){
                        System.out.println("線程一得到了lock2");
                    }
                }
            }
        });
        thread1.start();


        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock2){
                    System.out.println("線程二得到了lock2");
                    try{
                        //讓線程2,獲取鎖1
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("線程二獲取lock1");
                    //嘗試獲取lock1
                    synchronized (lock1){
                        System.out.println("線程二得到了lock1");
                    }
                }
            }
        });
        thread2.start();
    }
}

Java項目中多個線程怎么查找死鎖

1.2 死鎖的例子;

形成死鎖的條件:
1.互斥條件:(當一個資源被一個線程擁有,當被一個線程擁有后就不能被其他線程所持有)
2.請求擁有條件(一個線程所持有一個資源后又試圖請求另一個資源)可修改
3.不可剝奪性:(一個資源被一個線程擁有之后,如果這個線程不釋放此資源,那么其他線程不能強制獲得此資源)
4.環路等待條件(多個線程在獲取資源時形成一個環形鏈)可修改

二、使用jdk內置工具檢測死鎖

方法一. jconsole.exe

進入你的jdk安裝路徑中,打開jdk/bin/jconsole.exe
使用步驟如下:

Java項目中多個線程怎么查找死鎖

Java項目中多個線程怎么查找死鎖

Java項目中多個線程怎么查找死鎖

檢測結果:

Java項目中多個線程怎么查找死鎖

方法二. jvisualvm.exe

進入你的jdk安裝路徑中,打開jdk/bin/jvisualvm.exe
優點:比較細,比較全面
缺點:加載有點慢!
使用步驟如下:

Java項目中多個線程怎么查找死鎖

Java項目中多個線程怎么查找死鎖

可以在里面看到是該項目代碼的第39行出現了死鎖。

方法三. jmc.exe

進入你的jdk安裝路徑中,打開jdk/bin/jmc.exe
優點:可以對所以死鎖進行判斷
缺點:沒有給出解決方法
使用步驟如下:

Java項目中多個線程怎么查找死鎖

三、死鎖解決方法

通過死鎖的形成條件來解決死鎖問題,從根源上消除死鎖。
1.請求擁有條件(一個線程所持有一個資源后又試圖請求另一個資源)可修改
2.環路等待條件(多個線程在獲取資源時形成一個環形鏈)可修改

舉例修改: 方法:(修改環路等待條件)
//讓線程二和線程一競爭同一個鎖,修改為并行,這樣避免出現環路

public class Deadlock {
    public static void main(String[] args) {
        Object lock1 = new Object();
        Object lock2 = new Object();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock1){
                    System.out.println("線程一得到了lock1");
                    try{
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("線程一獲取lock2");
                    synchronized (lock2){
                        System.out.println("線程一得到了lock2");
                    }
                }
            }
        });
        thread1.start();


        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock1){   //讓線程二和線程一競爭同一個鎖,修改為并行,這樣避免出現環路
                    System.out.println("線程二得到了lock1"); 
                    try{
                        //讓線程2,獲取鎖1
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("線程二獲取lock1");
                    //嘗試獲取lock1
                    synchronized (lock2){
                        System.out.println("線程二得到了lock2");
                    }
                }
            }
        });
        thread2.start();

    }
}

Java項目中多個線程怎么查找死鎖

關于“Java項目中多個線程怎么查找死鎖”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

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

AI

陈巴尔虎旗| 咸丰县| 松江区| 积石山| 左权县| 西青区| 屏东市| 冕宁县| 栖霞市| 江城| 阳谷县| 博客| 嫩江县| 南岸区| 斗六市| 阿城市| 周口市| 沾益县| 前郭尔| 杭锦后旗| 六安市| 红安县| 常山县| 鞍山市| 珲春市| 平江县| 西华县| 高平市| 古交市| 天柱县| 进贤县| 东丽区| 潮安县| 六安市| 镇康县| 舒兰市| 长沙县| 东兰县| 阿巴嘎旗| 阿坝县| 罗田县|