线程死锁怎么产生的以及如何避免
死锁产生的四个必要条件:
- 互斥:一个资源每次只能被一个进程使用(资源独立)
- 请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放(不释放锁)
- 不剥夺:进程已获得的资源,在未使用之前,不能强行剥夺(抢夺资源)
- 循环等待:若干进程之间形成一种头尾相接的循环等待的资源关闭(死循环)
避免死锁的方法:
- 第一个条件 "互斥" 是不能破坏的,因为加锁就是为了保证互斥
- 一次性申请所有的资源,破坏 "占有且等待" 条件
- 占有部分资源的线程进一步申请其他资源时,如果申请不到,主动释放它占有的资源,破坏 "不可抢占" 条件
- 按序申请资源,破坏 "循环等待" 条件