【多线程编程核心技术】多线程的死锁

死锁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

图片描述