死锁问题
多线程因访问锁资源不当,导致永久挂起,无法继续,程序功能瘫痪
死锁产生的四个必要条件
* 四个条件都满足,死锁才会发生,这也是避免死锁问题的重要提示
1. 请求与保持条件:线程占用自身资源后,还要请求其他线程占用的资源
2. 互斥条件:锁资源的特性就是互斥性,同一时刻只允许一个线程访问,其他线程访问则被系统挂起
3. 不可剥夺条件:一个线程占用了资源(lock)后,无法通过外力强制剥夺该资源,只能由占有者自行释放
4. 循环等待条件:多线程并发,资源有限的情况下,每个单位都在等待相应线程资源
哲学家就餐问题
多线程资源有限的情况下,如何合理使用资源
1,2,3,4,5 假设都为单只筷子
哲学家行为模式
就餐:哲学家会先拿左手边的资源再获取右手边的,这个顺序每个哲学家都一样,两个资源都获取到,完成进餐任务
思考:不做任何事情,不需要任何资源
* 哲学家行为模式不可预测,随机触发
死锁现象:哲学家同时进餐,每个人获取左手资源,等待请求右手资源,但是无法获取,产生等待环路,造成死锁现象(永久被挂起)饥饿
活锁现象:哲学家获取一个资源后,发现另一个被占用,自己无法进餐,礼貌机制触发,释放占用的资源,但是如果五个哲学家行为同步,产生活锁,频繁申请释放资源,最终一直处于饥饿状态
高权策略:某个哲学家权限最高,他要进餐可以想低权哲学家发送通知,其他哲学家放弃进餐(资源无法有效利用,有效资源被浪费)
服务者模式:加入服务者单元,检测记录餐桌上资源占用情况,每个哲学家进餐是,询问服务者是否可以进餐,服务者根据餐桌上的情况进行反馈,在服务者的干预下,多个哲学家可以有序地进餐,资源可以被有效利用
银行家算法这里暂不介绍,有向了解的读者可以参考这篇文章
如果觉得《死锁和哲学家就餐问题》对你有帮助,请点赞、收藏,并留下你的观点哦!