定义
死锁就是两个或两个以上的线程在执行过程中,由于竞争资源或者互相通信导致彼此占用对方的锁资源而造成的一种阻塞现象,在没有外界作用下都在等待对方释放锁资源,导致程序无法进行下去。
上代码
public class t9 {
public static void main(String[] args) {
//定义了两把锁
Object lockA = new Object();
Object lockB = new Object();
//使用lanbda表达式新建线程
Thread t1 = new Thread(() -> {
// 1.占有一把锁(锁A)
synchronized (lockA) {
System.out.println("线程1:获得锁A。");
// 休眠 1s(让线程2有时间先占有锁B)
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 2.获取线程2的锁B
synchronized (lockB) {
System.out.println("线程1:嘿嘿,我抢到锁B了。");
}
}
});
t1.start();
Thread t2 = new Thread(() -> {
// 1.占有一把锁(锁B)
synchronized (lockB) {
System.out.println("线程2:获得了锁B!");
// 休眠1s(保证线程1能有充足的时间得到锁A)
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 2.获取线程1的锁A
synchronized (lockA) {
System.out.println("线程2:嘿嘿,我抢到锁A了!");
}
}
});
t2.start();
}
}
死锁产生的四个条件:
1.互斥条件
即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
2.不可剥夺条件
进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。
3.请求保持条件
进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
4循环等待条件
存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被链中下一个进程所请求
(户部请循)
解决方案
1.修改请求并持有条件:
获得了一把锁就不再请求另一把锁,别吃着碗里看着锅里了
2.破坏环路等待条件:
以确定的顺序获得锁,系统给每类资源赋予一个编号,每一个线程按编号递增的顺序请求资源,比如上面线程一和二按照数字大小依次请求锁A和B
3.超时放弃
如果在一定时间内没有获得锁,就将之前获得的锁全部释放