【多线程】死锁是怎么产生的?


死锁:一个线程需要同时获取多把锁,这时就容易发生死锁
例如: t1 线程获得A对象锁,接下来想获取B对象的锁 t2 线程获得B对象锁,接下来想获取A对象的锁

代码如下:

public class Deadlock {
          
   
	 public static void main(String[] args) {
          
   
		Object A = new Object(); 
  		Object B = new Object(); 
  		Thread t1 = new Thread(() -> {
          
    
  			synchronized (A) {
          
    
			  System.out.println("lock A"); 
			  try {
          
   
			  sleep(1000);
  			 } catch (InterruptedException e) {
          
    
   				throw new RuntimeException(e);
  		  }
  		  synchronized (B) {
          
   
   		  System.out.println("lock B"); 
    	  System.out.println("操作..."); 
    		 } 
    	 } 
     }, "t1");
Thread t2 = new Thread(() -> {
          
   
		 synchronized (B) {
          
   
		  System.out.println("lock B");
		   try {
          
   
		  	 sleep(500);
 		   } catch (InterruptedException e) {
          
   
     		 throw new RuntimeException(e); 
    	   }
    	 synchronized (A) {
          
    
    	 System.out.println("lock A"); 
    	 System.out.println("操作...");
      }
       } 
       }, "t2"); 
       t1.start(); 
       t2.start(); 
       } 
       }

控制台输出结果: 此时程序并没有结束,这种现象就是死锁现象...线程t1持有A的锁等待获取B锁, 线程t2持有B的锁等待获取A的锁。

如何进行死锁诊断?

当程序出现了死锁现象,我们可以使用jdk自带的工具:jps和 jstack

步骤如下: 第一:查看运行的线程

运行命令: jstack -l 46032

经验分享 程序员 微信小程序 职场和发展