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