死锁形成的几个必要条件
1、互斥
2、等待
3、不可抢占
4、循环等待
避免死锁的方法就是,打破任一个必要条件。循环等待最容易打破。
科学家进餐问题。(都是在获取左边的锁,)
abcde5个科学家顺时针坐在圆桌上(按先获取左边的锁,再去获取右边的)
假如 a要获取b的锁(right锁),(如果a现在无法获取b的锁,证明b现在有左边的锁,而且右边的锁没有被占用,b同时占用了2个锁之后执行结束释放左右的锁)a在b释放锁之后获取b的锁(也就是right锁)
简单的锁顺序死锁
一个操作是先获取左边的锁然后获取右边的锁,另一个操作先获取右边的锁然后获取左边的锁。
当一个线程获取了左边的锁之后准备去获取右边的锁,但是另一个线程获取了右边的锁,正准备获取左边的锁。这样锁都不会被释放形成死锁。
解决方法:
制定一个获取锁的顺序, 两个操作都先获取left或者先获取right(操作获取锁顺序是一致的)。