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

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

在这里插入图片描述

死锁原因:两个及两个以上的线程,抢占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);
    }
}

结果:
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

猜你喜欢

转载自blog.csdn.net/weixin_45335305/article/details/104368978