死锁编码及定位分析(故障排查)

什么是死锁?
在这里插入图片描述
在Java中使用多线程,就会有可能导致死锁问题。死锁会让程序一直卡住,不再程序往下执行。我们只能通过中止并重启的方式来让程序重新执行。

造成死锁的原因:

  • 当前线程拥有其他线程需要的资源
  • 当前线程等待其他线程已拥有的资源
  • 都不放弃自己拥有的资源
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() + "\t持有:"+lockA + "\t尝试获得" + lockB);
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (lockB){
                System.out.println(Thread.currentThread().getName() + "\t持有:"+lockB + "\t尝试获得" + lockA);
            }

        }

    }
}
public class DeadLockDemo {
    public static void main(String[] args) {
        String lockA = "lockA";
        String lockB = "lockB";
        new Thread(new HoldLockThread(lockA,lockB),"AAA").start();
        new Thread(new HoldLockThread(lockB,lockA),"BBB").start();
    }
}

在这里插入图片描述

那么怎么判断是死锁,为什么不是死循环

    /**
     * linux ps -ef|grep xxxx
     * windows下的java程序   也有类似ps的查看进程的命令,但是目前我们需要查看的只是java
     *            jps = java ps     jps -l
     */

在命令行下输入jps -l,查看到当前的JUC.DeadLockDemo进程号10440
在这里插入图片描述
然后用jstack 10440来查看
在这里插入图片描述
很长就不全部截图了,最后有个Found 1 deadlock
在这里插入图片描述

发布了83 篇原创文章 · 获赞 61 · 访问量 9169

猜你喜欢

转载自blog.csdn.net/weixin_43736084/article/details/103930459