死锁成因
1.互斥使用
当该锁被占用时,其他线程不可以获得该锁
2.不可抢占
当某线程拥有该锁时,其他线程只能阻塞等待,无法强制拥有该锁
3.请求和保持
当某线程拥有该锁的时候,只有当该线程主动释放该锁,其他线程才能够获得该锁
4.循环等待
线程之间相互等待,形成一个等待环路,导致死锁
死锁的解决方法
要解决死锁的问题,我们只需要破坏死锁成因中的任意一点即可,其中最普遍的做法就是打破循环等待
要打破循环等待,我们只需要在每个线程的加锁顺序都保持一致,按同一顺序获取锁,这样就可以做到避免形成等待环路。