https://www.bilibili.com/video/BV1av411q73F 描述死锁
https://www.bilibili.com/video/BV1SE411M7DR 王道
描述:
两个线程 互相需要对方手中的资源,造成循环等待的结果
产生死锁的4个条件:
1.互斥使用 (打印机)
2.请求且保持 (请求需要的资源,自己已经有的资源不放手,占有)
3.不可抢占 (不能从资源占有者手中 夺取资源)
4. 循环等待 (thread1等待thread2占有的资源 thread2等待thread1 占有的资源)
(死锁一定循环等待)
(循环等待 不一定死锁,说不定待会儿就有同类资源 给到thread2 thread2就可以运行了)
死锁的预防:破坏产生条件
1.互斥访问 (一般不要求破坏)(每次使用deep copy一份,多个thread使用各自的)
2.请求且等待 (请求需要的资源,自己已经有的资源不放手,占有)
(一次性申请所有需要的资源,如果申请补全,阻塞!)
(开始就资源全拿下!已经都有了,不需要请求了)
3.不可抢占 (不能从资源占有者手中 夺取资源)
(长时间申请不到需要的资源,主动放弃已有的资源) (suicide)
(资源在别人手中,我自己也不抢占!那我自己放弃全部)
4. 循环等待 (thread1等待thread2占有的资源 thread2等待thread1 占有的资源)
(序号!)
(thread1需要 AB thread2需要BA 那么都按照AB的顺序来拿)
其他解决方案:
1.增加顺序,按顺序拿资源
(thread1 拿AB,thread 2 拿BA ,那么都按照AB这样的顺序拿,thread2 就拿不到了。)
2.超时检测
3.死锁检测
银行家算法
分配资源之前,先判断是否系统进入不安全状态
https://www.bilibili.com/video/BV1kb41147CT 11min附近
thread需要的资源 < 我手上的资源,那我资源给他,
随后他把早借的资源+刚借的资源 全还给我,我手上资源变多了!