当多个线程相互等待已经被对方占用的资源时,就会产生死锁。
举例
public class DeadLock {
public static void main(String[] args) {
// 锁A
Object lockA = new Object();
// 锁B
Object lockB = new Object();
// 第一条线程
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程1开始 #####");
synchronized (lockA) {
try {
System.out.println("lockA #####");
Thread.sleep(1000);
synchronized (lockB) {
System.out.println("线程1");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t1.start();
// 第二条线程
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程2开始 #####");
synchronized (lockB) {
try {
System.out.println("lockB #####");
Thread.sleep(1000);
synchronized (lockA) {
System.out.println("线程2");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t2.start();
}
}
运行结果
线程1开始 #####
lockA #####
线程2开始 #####
lockB #####
上述过程简述如下
1.线程1首先获得锁A,然后sleep 2秒
2.线程1首先获得锁B,然后sleep 2秒
3.线程1 sleep 2秒后继续执行,此时需要锁B,但是此时B已经被线程持有,线程1被阻塞。
4.线程2 sleep 2秒后继续执行,它需要锁A,然而A此时被线程1持有还未释放,线程2被阻塞
5.这时就会出现死锁,如运行结果那样。
避免死锁
1.同一线程不要嵌套使用多个锁
2.同一线程不要占用多个计算机资源
3.给锁加上超时时间