死锁编码及定位分析

死锁产生的原因

简单来说就是 不同的线程 持有对方需要的锁的同时, 还妄图去获取别人手中持有锁 ,外部无法干涉,造成一直在相互等待

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

死锁的解决方案 详细的可以去参考 哲学家问题

手写一个死锁案例

package com.demo;

/**
 * 手写一个死锁案例
 */
public class DeadlockDemo {
     
    public static void main (String[] args) throws InterruptedException {
     
        DeadLockCache deadLockCache = new DeadLockCache();

        new Thread(()->{
     
            try {
     
                deadLockCache.getLockB();
            } catch (InterruptedException e) {
     
                e.printStackTrace();
            }
        },"A").start();
        //睡一秒 保证A线程拿到A 后 接下来是B线程获取到B锁
        Thread.sleep(1000);


        new Thread(()->{
     
            try {
     
                deadLockCache.getLockA();
            } catch (InterruptedException e) {
     
                e.printStackTrace();
            }
        },"B").start();
    }

}

class DeadLockCache{
     
    private Object lockA = new Object();
    private Object lockB = new Object();

    /**
     * 拿到锁A 3秒后想去拿 锁B
     */
    public void getLockB() throws InterruptedException {
     
        synchronized (lockA){
     
            System.out.println(Thread.currentThread().getName()+"拿到了lockA锁");

            Thread.sleep(3000);

            System.out.println(Thread.currentThread().getName()+"睡三秒尝试获取lockB锁");

            synchronized (lockB){
     }
        }
    }

    /**
     * 拿到锁B 3秒后想去拿 锁A
     */
    public void getLockA() throws InterruptedException {
     
        synchronized (lockB){
     
            System.out.println(Thread.currentThread().getName()+"拿到了lockB锁");

            Thread.sleep(3000);

            System.out.println(Thread.currentThread().getName()+"睡三秒尝试获取lockA锁");

            synchronized (lockA){
     }
        }
    }
}

结果 这里出现了死锁 程序一直在等待
死锁编码及定位分析_第1张图片

定位

jps命令定位进程号
死锁编码及定位分析_第2张图片

jstack 进程号 找到死锁查看死锁编码及定位分析_第3张图片

死锁编码及定位分析_第4张图片

你可能感兴趣的:(面试题集合)