1.什么是死锁
线程在获取资源的时候,由于获取不到,导致线程卡死(阻塞),程序就不执行了。
2.发生死锁的情况
1.一个线程获取一把锁
一个线程如果同时获取一把锁两次,如果是可重入锁,就没有问题
如果是不可重入锁就会发生死锁问题
2.两个线程获取两把锁
线程A在等待线程B,线程B在等待线程A,循环等待造成死锁问题
线程0获取到了锁1,线程1获取到了锁2,线程0等待锁2,线程1等待锁1,相互等待,无法释放造成了死锁。
3.多个线程获取多把锁
线程A等待线程B释放锁,线程B等待线程C释放锁,线程C等待线程A释放锁
3.造成死锁的原因
1.互斥访问:线程1拿到了锁1,线程2就不能同时得到该锁(互斥锁)
2.不可抢占:获取到锁的线程,除非自己主动释放锁,别的线程不能从它手里抢过来
3.保持与请求:线程1已经获取到了锁A,还要在这个基础上去获取锁B
4.循环等待:线程1等待线程2获取锁,线程2等待线程3获取锁,线程3等待线程1获取锁……
以上四条是造成死锁的必要条件,也就是说只要打破一条,死锁就不会形成。
4.分析如何解决死锁问题
1.互斥访问:锁的基本特性,不能打破。
2.不可抢占:锁的基本特性不能打破。
3.保持与请求:与代码的设计和实现相关,是可以打破的,只要规定一下获取锁的顺序。
4.循环等待:也可以打破,从设计的角度去合理的获取锁。