java死锁Demo和死锁检测

该博客探讨了Java并发编程中的死锁问题,通过`jstack`命令进行死锁检测。示例代码展示了两个线程可能产生死锁的场景,线程分别持有不同锁并尝试获取对方持有的锁,从而可能导致死锁状态。博客强调了理解和避免死锁在多线程编程中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.util.concurrent.TimeUnit;

/**
 * @author Jing
 * @date 2020/10/6 0006 17:37
 */
public class DieLockDemo {
    public static void main(String[] args) {
        String a = "a";
        String b = "b";
        Source2 source2 = new Source2(a, b);
        Source2 source21 = new Source2(b, a);
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                try {
//                    source2.run();
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            }
//        }).start();
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                try {
//                    source21.run();
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            }
//        }).start();
        new Thread(new Source1(a,b)).start();
        new Thread(new Source1(b,a)).start();
    }
}
class Source1 implements Runnable{
    String LockA;
    String LockB;

    public Source1(String lockA, String lockB) {
        LockA = lockA;
        LockB = lockB;
    }

    public void run(){
        synchronized (LockA){
            System.out.println("我拿到了"+LockA);
            synchronized (LockB){
                System.out.println("我想要"+LockB);
            }
        }
    }
}
class Source2 {
    String LockA;
    String LockB;

    public Source2(String lockA, String lockB) {
        LockA = lockA;
        LockB = lockB;
    }

    public void run() throws InterruptedException {
        synchronized (LockA){
            System.out.println("我拿到了"+LockA);
            TimeUnit.SECONDS.sleep(1);
            synchronized (LockB){
                System.out.println("我想要"+LockB);
            }
        }
    }
}

死锁检测:
通过jsp-l命令找到后台的java进程,这里并不能看出哪个是死锁的进程,需要记住每一个或者你认为有死锁的进程的编号。
jstack+进程编号 然后会发现有一个deadlock就说明这有个死锁。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值