【多線程編程核心技術】多線程的死鎖

死鎖java

Java 線程是死鎖是一個經典的多線程問題,由於不一樣的線程都在等待根本不可能被釋放的鎖,從而致使全部的任務都沒法繼續完成多線程

舉個例子

DealThread.javaide

package dealThread.demo;

public class DealThread implements Runnable{
    public String username;
    public Object lock1 = new Object();
    public Object lock2 = new Object();
    
    public void setFlag(String username){
        this.username = username;
    }
    
    @Override
    public void run(){
        if(username.equals("a")){
            synchronized (lock1){
                try{
                    System.out.println("username="+username);
                    Thread.sleep(3000);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
                
                synchronized (lock2){
                    System.out.println("lock1 -> lock2");
                }
            }
        }
        
        if(username.equals("b")){
            synchronized (lock2){
                try{
                    System.out.println("username="+username);
                    Thread.sleep(3000);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
            
                synchronized (lock1){
                    System.out.println("lock2 -> lock1");
                }
            }
        }
    }
    
}

Run.java工具

package dealThread.demo;

public class Run {
    public static void main(String[] args){
        try{
            DealThread t1 = new DealThread();
            t1.setFlag("a");
            Thread thread1 = new Thread(t1);
            thread1.start();
            Thread.sleep(1000);
            
            t1.setFlag("b");
            Thread thread2 = new Thread(t1);
            thread2.start();
            
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }
}

運行結果以下:
圖片描述this

線程thread1和thread2都持有對方的鎖,並且須要等待對方釋放鎖以後才能往下繼續運行,這個時候就發生了死鎖;其實不使用嵌套的synchronized代碼結構也會出現死鎖,與嵌套不嵌套沒有任何關係,只要互相等待對方釋放鎖就有可能出現死鎖。spa

使用JDK工具監測死鎖

進入JDK的安裝目錄中的bin目錄,執行jps命令:線程

圖片描述

能夠看出獲得運行的線程Run的id值爲7404,再執行jstack命令,查看結果:
圖片描述code

圖片描述

相關文章
相關標籤/搜索