多线程:死锁
当多个线程互相争抢资源导致都在互相等待资源的僵局时,如果没有外力,将会一直僵持下去,这就是死锁.
就像两个人分一双筷子,如果一人拿到一根筷子,都在等待对方手里的那根,将没有人能完成吃饭的任务.
死锁的必要条件
1,互斥
即资源只能被一个线程调用
2,不可剥夺
资源已获得的资源不可被剥夺
3,请求和保持条件
资源请求资源时不会对自己的资源放手
4,循环等待
资源之间头尾相接等待资源
死锁场景演示
死锁出现的场景非常多,这里仅简单展示一下死锁的原理
public static final Object source1 = new Object();
public static final Object source2 = new Object();
public static void main(String[] args) {
new Thread(()->{
while(true){
synchronized (source1){
System.out.println(Thread.currentThread().getName()+"拿到了source1,正在等待source2");
synchronized (source2){
System.out.println(Thread.currentThread().getName()+"拿到了source1和source2,执行完毕");
}
}
}
},"Thread1").start();
new Thread(()->{
while(true){
synchronized (source2){
System.out.println(Thread.currentThread().getName()+"拿到了source2,正在等待source1");
synchronized (source1){
System.out.println(Thread.currentThread().getName()+"拿到了source1和source2,执行完毕");
}
}
}
},"Thread2").start();
}
由于锁的嵌套存在,两个资源都拥有互斥性,所以当两个资源被不同线程拿到并且线程都需要另一个资源来继续执行时,就会出现死锁.