线程死锁demo和快速定位

1.线程死锁是怎么产生的

两个或者两个以上的进程在执行的过程中,因争夺资源导致相互等待而产生的

2.死锁产生的因素

1.系统资源不足
2.资源分配不当
3.进程的运行推动的顺序不合适

3.手写一个线程死锁的demo

package com.company;

class HoldLockThread implements Runnable {
    private String lockA;
    private String lockB;

    public HoldLockThread(String lockA, String lockB) {
        this.lockA = lockA;
        this.lockB = lockB;
    }

    @Override
    public void run() {
        synchronized (lockA) {
            System.out.println("线程名称:" + Thread.currentThread().getName() + "==>已拿到锁:" + lockA + "==>需要获取锁:" + lockB);
            try {
                Thread.sleep(10);
            } catch (Exception e) {
                e.printStackTrace();
            }
            synchronized (lockB) {
                System.out.println("线程名称:" + Thread.currentThread().getName() + "==>已拿到锁:" + lockB + "==>需要获取锁:" + lockA);
            }
        }
    }
}

public class DeadLock {

    public static void main(String[] args) {
        // write your code here
        var lockA = "lockA";
        var lockB = "lockB";
        new Thread(new HoldLockThread(lockA, lockB), "ThreadA").start();
        new Thread(new HoldLockThread(lockB, lockA), "ThreadB").start();
    }
}

4.死锁代码定位

1.定位进程id

cmd执行  jps -l

2.结果输出

11712 org.jetbrains.jps.cmdline.Launcher
1300
2196 jdk.jcmd/sun.tools.jps.Jps
1272 org.jetbrains.kotlin.daemon.KotlinCompileDaemon
8776 com.company.DeadLock

3.发现id为8776进程是不是和我们的类包路径一致

4.执行jstack 8776

Found one Java-level deadlock:
=============================
"ThreadA":
  waiting to lock monitor 0x00000254cf898f00 (object 0x000000071225dac0, a java.lang.String),
  which is held by "ThreadB"
"ThreadB":
  waiting to lock monitor 0x00000254cfbe4600 (object 0x000000071225da90, a java.lang.String),
  which is held by "ThreadA"

Java stack information for the threads listed above:
===================================================
"ThreadA":
        at com.company.HoldLockThread.run(DeadLock.java:22)
        - waiting to lock <0x000000071225dac0> (a java.lang.String)
        - locked <0x000000071225da90> (a java.lang.String)
        at java.lang.Thread.run(java.base@11.0.8/Thread.java:834)
"ThreadB":
        at com.company.HoldLockThread.run(DeadLock.java:22)
        - waiting to lock <0x000000071225da90> (a java.lang.String)
        - locked <0x000000071225dac0> (a java.lang.String)
        at java.lang.Thread.run(java.base@11.0.8/Thread.java:834)

Found 1 deadlock.


5. 线程发生死锁的代码位置 com.company.HoldLockThread.run(DeadLock.java:22)

以上就是手写线程死锁和定位发生死锁位置的操作过程,如果解决的话修改代码逻辑方可

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值