线程------线程死锁原因、发现线程死锁方法、如何避免线程死锁

死锁:指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力的作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程称为死锁线程

线程------线程死锁原因、发现线程死锁方法、如何避免线程死锁_第1张图片

死锁原因:两个及两个以上的线程,抢占2把及两把以上的锁,抢占锁的顺序不一致

发现线程死锁的方法:

public class DeadLockSample {
    private final static Object lock1 = new Object();
    private final static String lock2 = new String();


    public static void main(String[] args) throws Exception {
        newThread("ThreadA", lock1, lock2).start();

        newThread("ThreadB", lock2, lock1).start();

        System.in.read();
    }

    private static Thread newThread(String threadName, Object lockFirst, Object lockSecond) {
        return new Thread(() -> {
            synchronized (lockFirst) {
                System.out.println(Thread.currentThread().getName() + " holding lockFirst");
                try {
                    Thread.sleep(3000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " waiting lockSecond");
                synchronized (lockSecond) {
                    System.out.println(Thread.currentThread().getName() + " holding lockSecond");
                }
            }
        }, threadName);
    }
}

结果:
线程------线程死锁原因、发现线程死锁方法、如何避免线程死锁_第2张图片

解决方法:使用jps命令和jstack命令

线程------线程死锁原因、发现线程死锁方法、如何避免线程死锁_第3张图片
线程------线程死锁原因、发现线程死锁方法、如何避免线程死锁_第4张图片
线程------线程死锁原因、发现线程死锁方法、如何避免线程死锁_第5张图片

如何避免代码出现的线程死锁:

1.尽量不要使用2把及以上的锁
2.必须使用2把及以上锁的时候,确保在整个应用程序中对获取锁的顺序是一致的
3.尝试获取具有超时释放的锁,例如Lock中的tryLock来获取锁
4.当发生了Java-level的锁时,分析原因,修改代码,然后重启程序来干掉进程/线程

你可能感兴趣的:(线程)