死锁问题 |
现在有 2 个锁对象 a 和 b ,两个线程 x, y
x 锁对象的顺序为 a -> b
y 锁对象的顺序为 b -> a
- x 锁了 a,同时 y 也锁了 b
- 此时 x 不能再锁 b,y 也不能锁 a
- x 和 y 都在线程池中等待对方换锁,这种情况称为死锁。
- 死锁会一直僵持在线程中,不进行其他动作,不会执行代码,不产生异常,很难发现和调试。
死锁代码展示 |
public class DeadLock {
public static void main(String[] args) {
// 创建对象
Object o1 = new Object();
Object o2 = new Object();
// 创建线程
MyThread1 t1 = new MyThread1(o1, o2);
MyThread2 t2 = new MyThread2(o1, o2);
// 启动线程
t1.start();
t2.start();
}
}
// 线程类 1,先锁 a 再锁 b
class MyThread1 extends Thread {
Object o1;
Object o2;
public MyThread1(Object o1, Object o2) {
this.o1 = o1;
this.o2 = o2;
}
public void run() {
synchronized (o1) {
// 模拟延迟,放大问题
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
}
}
}
}
// 线程类 2,先锁 b 再锁 a
class MyThread2 extends Thread {
Object o1;
Object o2;
public MyThread2(Object o1, Object o2) {
this.o1 = o1;
this.o2 = o2;
}
public void run() {
synchronized (o2) {
// 模拟延迟,放大问题
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1) {
}
}
}
}
- 以上代码执行效果为,程序一直运行,不会结束。
- 开发中最好不要嵌套使用 synchronized 关键字,容易引发死锁问题。