对于死锁的理解

2020-09-06  本文已影响0人  倚仗听江

死锁是指两个或两个以上的线程因为争夺资源而造成的一种互相等待的现象,若无外力干涉,他们都将无法进行下去。

死锁.png

直接上代码吧,我们写一个死锁的示例

class HoldLockThread implements Runnable {

    String lockA;
    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(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (lockB) {
                System.out.println(Thread.currentThread().getName());
            }
        }
    }
}

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();
    }
}

那万一发生了死锁我们怎么定位呢?
首先我们可以用jps定位进程号


jps定位进程号.png

再用jstack找到死锁查看(用于生成虚拟机当前时刻的线程快照)


jstack找到死锁查看.png
上一篇 下一篇

猜你喜欢

热点阅读