一个简单的死锁demo以及死锁分析

废话不多说,直接贴上demo代码:

import java.util.concurrent.TimeUnit;

public class DeadlockTest {
    public static void main(String[] args) {
        ResourceDeadlockTest resourceDeadlockTest = new ResourceDeadlockTest();

        String a = "suoA";
        String b = "suoB";

        new Thread(()->resourceDeadlockTest.deadLockTest(a, b)).start();
        new Thread(()->resourceDeadlockTest.deadLockTest(b, a)).start();
    }
}

class ResourceDeadlockTest{

    public void deadLockTest( String lockA, String lockB){
        synchronized (lockA) {
            System.out.println(Thread.currentThread().getName() + "\t持有锁:"+lockA);
            try {
                TimeUnit.SECONDS.sleep(2);
                synchronized (lockB){
                    System.out.println(Thread.currentThread().getName() + "\t持有锁:"+lockB);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

分析过程:

一、首先用jsp -l查询到当前死锁的java进程。

jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示***当前用户***所有java进程pid的命令。

在这里插入图片描述

二、然后用jstack xxxx得到指定pid的java stack堆栈信息
Found one Java-level deadlock:
=============================
"Thread-0":
  waiting to lock monitor 0x00000214db80c300 (object 0x00000000892b0940, a java.lang.String),
  which is held by "Thread-1"
"Thread-1":
  waiting to lock monitor 0x00000214db809c00 (object 0x00000000892b0910, a java.lang.String),
  which is held by "Thread-0"

Java stack information for the threads listed above:
===================================================
"Thread-0":
        at com.solid.demo.deadlockTest.ResourceDeadlockTest.deadLockTest(DeadlockTest.java:25)
        - waiting to lock <0x00000000892b0940> (a java.lang.String)
        - locked <0x00000000892b0910> (a java.lang.String)
        at com.solid.demo.deadlockTest.DeadlockTest.lambda$main$0(DeadlockTest.java:12)
        at com.solid.demo.deadlockTest.DeadlockTest$$Lambda$14/0x0000000100065c40.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.7/Thread.java:834)
"Thread-1":
        at com.solid.demo.deadlockTest.ResourceDeadlockTest.deadLockTest(DeadlockTest.java:25)
        - waiting to lock <0x00000000892b0910> (a java.lang.String)
        - locked <0x00000000892b0940> (a java.lang.String)
        at com.solid.demo.deadlockTest.DeadlockTest.lambda$main$1(DeadlockTest.java:13)
        at com.solid.demo.deadlockTest.DeadlockTest$$Lambda$15/0x0000000100098040.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.7/Thread.java:834)

Found 1 deadlock.

主要关注这些内容,发现了一个死锁,线程Thread-0持有锁<0x00000000892b0910> (a java.lang.String),等待锁<0x00000000892b0940> (a java.lang.String);线程Thread-1持有锁<0x00000000892b0940> (a java.lang.String),等待锁<0x00000000892b0910> (a java.lang.String)。这就可以排查到死锁的原因从而进一步解决问题。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值