java多线程死锁及定位分析

定义:

    死锁指两个及两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待(阻塞)现象。

图示:

  

代码:(注:细节都在代码注释中,代码说话多动手)

public class DeadLockDemo {
    public static void main(String[] args) {
        String lockA = "lockA";
        String lockB = "lockB";
        //以下两个线程参数顺序不一致  第一个参数代表[已经持有的资源]  第二个参数代表[想要得到的资源]
        new Thread(new HoldLockThread(lockA,lockB),"ThreadA").start(); //“线程操作资源类” 这句话在这里体现 ****
        new Thread(new HoldLockThread(lockB,lockA),"ThreadB").start(); //自己的理解:“线程是一个载体”
    }
}
class HoldLockThread implements Runnable{
    private String hadResource; //已经持有的资源
    private String togetResouce;//想要得到的资源

    public HoldLockThread(String hadResource, String togetResouce) {
        this.hadResource = hadResource;
        this.togetResouce = togetResouce;
    }

    @Override
    public void run() {
        synchronized (hadResource){
            System.out.println(Thread.currentThread().getName()+"\t 已经持有"+hadResource+"\t 尝试得到"+togetResouce);
            //注意: 这里让线程休眠的目的是为了让另一线程 拿到 第一把锁并尝试得到第二把锁  ********
            try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace();}
            synchronized (togetResouce){
                System.out.println(Thread.currentThread().getName()+"\t 恭喜拿到"+ togetResouce);
            }
        }
    }
}

控制台现象:

两个排查死锁的命令:

①:jps 等同于linux的 ps -ef|grep xxxx  java提供的一个显示当前所有java进程pid的命令

②jstack: j用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息

信息详情如下:

 写到最后(如果任何问题可联系👇)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值