Java每个对象都有一把锁,当前进程使用对象锁1,没有释放该锁,又想要去获取另一把对象锁2,而对象锁2被另外一个线程持有,没有释放,这就很容易出现死锁
1.死锁实例
public class DeadLockTest {
private static Object object1 = new Object();
private static Object object2 = new Object();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (object1) {
System.out.println("线程1获取object1锁...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object2) {
System.out.println("线程1获取object2锁...");
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (object2) {
System.out.println("线程2获取object2锁...");
synchronized (object1) {
System.out.println("线程2获取object1锁...");
}
}
}
}).start();
System.out.println("main 线程执行完毕...");
}
}
分析:线程1持有object1的锁,同时又想去获取object2的锁,而此时线程2又持有object2的锁没有释放,又想去获取object1的锁,这就造成了死锁。
2.通过命令查看死锁
前提:进入jdk的bin目录下
2.1 jps
jps命令查看Java相关进程
2.2 jstack
jstack:查看分析具体的进程执行情况
运行上面的程序,执行jps命令,发现上面代码的进程号为14888