jstack分析多线程死锁,来吧 逃离我推掉我的手 2023-10-06 21:21 3阅读 0赞 ### 1、模拟死锁 ### public class DeadLockTest { public static void main(String[] args){ A a = new A(); B b = new B(); // a和b互相引用 a.next = b; b.next = a; // 启动a b两个线程 new Thread(a,"aThread").start(); new Thread(b,"bThread").start(); } } class A extends T implements Runnable { T next; public synchronized void invoke() { System.out.println("当前线程:" + Thread.currentThread().getName() + " | 进入了" + this.getClass().getSimpleName() + " 获取到资源 | 准备调用:" + next.getClass().getSimpleName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } next.invoke(); } @Override public void run() { invoke(); } } class B extends T implements Runnable { T next; public synchronized void invoke() { System.out.println("当前线程:" + Thread.currentThread().getName() + " | 进入了" + this.getClass().getSimpleName() + " 获取到资源 | 准备调用:" + next.getClass().getSimpleName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } next.invoke(); } @Override public void run() { invoke(); } } class T { public synchronized void invoke(){ } } 上面的代码也很简单,就是A对象`持有`B对象的`引用`,B对象`持有`A对象的`引用`。 在线程a进入到`invoke`方法时`锁住`了A对象,线程b也进入到invoke方法锁住了B对象。 线程a再`调用`B对象的`invoke`方法去试图锁住B对象时,发现B对象已经被锁住了,需要等待,同理b线程也是如此。 就导致了两个线程相互等待对方释放锁。有点绕,如果不明白,好好品下。 咱们运行下上面的代码,看下结果: 当前线程:aThread | 进入了A 获取到资源 | 准备调用:B 当前线程:bThread | 进入了B 获取到资源 | 准备调用:A ### 2、查找进程日志 ### 我们使用jps查找进程,再用jstack dump线程日志信息 ![图片][95e8222bb4fb920a1db130facefdac56.png] dump的时候忘记加磁盘标识,结果dump的文件到C:\\Users\\Administrator这个目录里面去了 ### 3、分析 ### 下面我们看看日志里面是怎么记录的,首先,我们全文搜索【deadlock】关键字,如下图: ![b65448ab1e9f466ab9ae3797a9999a9a.gif][]上图展示了bThread和aThread发生了死锁,具体是哪块的代码还不清楚,咱们根据A对象0x000000078bb84c68继续往下搜索 ![图片][4b1cf5c157288730b078a53dddf5e75f.png] 现在咱们就很清楚死锁的代码所在了,剩下的就是优化代码了。 ### 4、总结 ### 一般来说,线程的日志是非常大,不可能一眼就能看出问题的所在,现在我们重点来说排查的思路: 首先就要找关键字,比如: * **deadlock**:表示有死锁。 * **Waiting on condition**:等待某个资源或条件发生来唤醒自己。 * **Blocked**:阻塞。 * **Waiting on monitor entry**:在等待获取锁。 找到这些关键字,再找到具体的线程进行分析,最后根据线程死锁的执行的方法,去查看代码。 **文末福利 可以加小新老师vx免费获取【Java高清路线图】和【全套学习视频和配套资料】** ![b377cf07fb224d46a3ff5929e9078e99.png][] [95e8222bb4fb920a1db130facefdac56.png]: https://img-blog.csdnimg.cn/img_convert/95e8222bb4fb920a1db130facefdac56.png [b65448ab1e9f466ab9ae3797a9999a9a.gif]: https://img-blog.csdnimg.cn/b65448ab1e9f466ab9ae3797a9999a9a.gif [4b1cf5c157288730b078a53dddf5e75f.png]: https://img-blog.csdnimg.cn/img_convert/4b1cf5c157288730b078a53dddf5e75f.png [b377cf07fb224d46a3ff5929e9078e99.png]: https://img-blog.csdnimg.cn/b377cf07fb224d46a3ff5929e9078e99.png
相关 Java多线程:死锁案例分析 死锁是多线程编程中的一种常见问题,它发生在两个或更多的线程互相等待对方释放资源的情况下。 以下是一个经典的Java死锁案例分析: 案例:银行转账系统 假设我们有一个银行转 怼烎@/ 2024年10月27日 17:00/ 0 赞/ 35 阅读
相关 Java多线程:死锁案例分析 在Java多线程编程中,死锁是一种严重的问题。简单来说,死锁就是两个或多个线程相互等待对方释放资源的情况,但这种等待是无限的,所以会导致整个系统无法进行。 下面是一个经典的J 向右看齐/ 2024年09月21日 14:03/ 0 赞/ 62 阅读
相关 Java多线程:死锁实例分析 在Java多线程编程中,死锁是一种常见的问题。简单来说,死锁发生时,两个或更多的线程因争夺资源而造成的一种互相等待的现象,且这种状态无法通过各自释放已获取的资源来打破。 下面 迷南。/ 2024年09月12日 06:18/ 0 赞/ 65 阅读
相关 jstack分析多线程死锁,来吧 1、模拟死锁 public class DeadLockTest { public static void main(String[] args){ 逃离我推掉我的手/ 2023年10月06日 21:21/ 0 赞/ 4 阅读
相关 Java多线程 定位死锁--jstack 文章目录 jstack定位死锁 两个线程死锁分析 多个线程死锁分析 jstack定位死锁 死锁发生的 缺乏、安全感/ 2022年12月05日 15:15/ 0 赞/ 183 阅读
相关 多线程死锁 / 死锁:二个线程同时锁住一个变量时。 锁住一个变量之后,尽快操作完成解锁,解锁之前不要再锁住其它变量,否则会互锁(死锁)。 / 川长思鸟来/ 2022年07月15日 14:28/ 0 赞/ 325 阅读
相关 多线程-死锁 / 死锁:常见情景之一:同步的嵌套。 / class Ticket implements Runnable { pr 向右看齐/ 2022年06月02日 07:57/ 0 赞/ 300 阅读
相关 多线程死锁 峨眉山月半轮秋,影入平羌江水流 Java线程的死锁一直都是经典的多线程问题;因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都不能继续执行; 示例代码: た 入场券/ 2022年05月24日 04:09/ 0 赞/ 415 阅读
相关 多线程死锁 同步锁使用的弊端:当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步。这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁。这种情况能避免就避免掉。 雨点打透心脏的1/2处/ 2022年03月08日 07:50/ 0 赞/ 384 阅读
还没有评论,来说两句吧...