执行命令jstack -l 5620 jstack_out.txt测试代码// 模拟一个死锁finalObjectlock1newObject();finalObjectlock2newObject();// 线程1先获取lock1再获取lock2newThread(()-{synchronized(lock1){System.out.println(Thread 1: Holding lock1);try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println(Thread 1: Waiting for lock2);synchronized(lock2){System.out.println(Thread 1: Holding lock1 and lock2);}}},Thread-1).start();// 线程2先获取lock2再获取lock1newThread(()-{synchronized(lock2){System.out.println(Thread 2: Holding lock2);try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println(Thread 2: Waiting for lock1);synchronized(lock1){System.out.println(Thread 2: Holding lock2 and lock1);}}},Thread-2).start();执行结果文件部分摘取G1 Serviceos_prio2cpu0.00ms elapsed88.45s tid0x000002436ed32090nid0x29f8runnableG1 Refine#0os_prio2cpu0.00ms elapsed88.45s tid0x000002436ed317c0nid0x25a0runnableG1 Conc#0os_prio2cpu125.00ms elapsed88.45s tid0x00000243559bdb90nid0x4528runnableG1 Main Markeros_prio2cpu0.00ms elapsed88.45s tid0x00000243559bc2c0nid0x3b68runnableGC Thread#0os_prio2cpu187.50ms elapsed88.45s tid0x00000243559ab350nid0x43a8runnableJNIglobal refs:150,weak refs:101// 死锁信息FoundoneJava-level deadlock:Thread-1:waitingtolockmonitor0x0000024380d72d60(object0x000000062009e600,ajava.lang.Object),which is held byThread-2Thread-2:waitingtolockmonitor0x0000024380d73460(object0x000000062009e5f0,ajava.lang.Object),which is held byThread-1Javastack informationforthe threads listed above:Thread-1:atcom.gongjiangwangluo.gjwl.server.GjwlServerApplication.lambda$0(GjwlServerApplication.java:42)-waitingtolock0x000000062009e600(ajava.lang.Object)-locked0x000000062009e5f0(ajava.lang.Object)atcom.gongjiangwangluo.gjwl.server.GjwlServerApplication$$Lambda$2706/0x000002430a1ee4d8.run(UnknownSource)atjava.lang.Thread.run(java.base17.0.16/Thread.java:840)Thread-2:atcom.gongjiangwangluo.gjwl.server.GjwlServerApplication.lambda$1(GjwlServerApplication.java:58)-waitingtolock0x000000062009e5f0(ajava.lang.Object)-locked0x000000062009e600(ajava.lang.Object)atcom.gongjiangwangluo.gjwl.server.GjwlServerApplication$$Lambda$2708/0x000002430a1ee928.run(UnknownSource)atjava.lang.Thread.run(java.base17.0.16/Thread.java:840)Found1deadlock.死锁分析从日志中可以看出存在两个线程Thread-1和Thread-2互相等待对方持有的锁导致死锁。具体表现为Thread-1持有锁0x000000062009e5f0并等待锁0x000000062009e600。Thread-2持有锁0x000000062009e600并等待锁0x000000062009e5f0。死锁位置死锁发生在以下代码位置Thread-1的堆栈指向GjwlServerApplication.java:42。Thread-2的堆栈指向GjwlServerApplication.java:58。解决方法检查锁的获取顺序确保所有线程以相同的顺序获取锁。例如如果多个线程需要获取锁A和锁B应统一先获取锁A再获取锁B。使用超时机制在获取锁时设置超时时间避免无限等待。例如使用tryLock方法if(lock1.tryLock(100,TimeUnit.MILLISECONDS)){try{if(lock2.tryLock(100,TimeUnit.MILLISECONDS)){try{// 业务逻辑}finally{lock2.unlock();}}}finally{lock1.unlock();}}减少锁的粒度尽量避免在方法或代码块中持有多个锁。可以通过缩小锁的范围或使用更细粒度的锁来降低死锁风险。使用工具检测定期使用jstack或其他工具如VisualVM、JProfiler检测死锁及时发现并解决问题。修复建议根据堆栈信息修改GjwlServerApplication.java中第42行和第58行的代码逻辑确保锁的获取顺序一致。如果可能重构代码以避免嵌套锁的使用。