「多线程锁」手写死锁案例及排查死锁原因

一、什么是死锁?

死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,如果资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。

1

二、手写死锁案例

public class DeadLockDemo {
    public static void main(String[] args) {
        final Object objectA = new Object();
        final Object objectB = new Object();

        new Thread(() -> {
            synchronized (objectA) {
                System.out.println(Thread.currentThread().getName() + "\t 自己持有A锁,希望获取B锁");
                try {
                    TimeUnit.MILLISECONDS.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                synchronized (objectB) {
                    System.out.println(Thread.currentThread().getName() + "\t 成功获取B锁");
                }
            }
        }, "A").start();

        new Thread(() -> {
            synchronized (objectB) {
                System.out.println(Thread.currentThread().getName() + "\t 自己持有B锁,希望获取A锁");
                try {
                    TimeUnit.MILLISECONDS.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                synchronized (objectA) {
                    System.out.println(Thread.currentThread().getName() + "\t 成功获取A锁");
                }
            }
        }, "B").start();
    }
}

案例说明

代码中存在两个线程,其中线程A尝试获取B锁,而线程B尝试获取A锁。

运行结果

a

解析

线程A在获取B的锁时,A已被上锁,而在线程A睡眠的1s内,线程B也尝试获取A的锁,由图片我们可以知道程序并未停止,二者因争夺资源而造成的一种互相等待的死锁现象。

三、死锁排查

纯指令

在终端输入 jps -l找到该类对应的进程号

123

再输入jstack 28773查看对应堆信息
12

可以看到双方互相持有、相互等待,以致造成死锁。

图形化

在终端输入jconsole选择对应进程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里可以清楚看到死锁位置及信息。

以上是死锁相关知识,希望对大家有所帮助。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FrozenPenguin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值