什么是死锁、导致死锁的原因,活锁、饥饿又是什么?

死锁

       是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

       一个线程先获取from锁,另一个先获取to锁(在获取两个锁的代码之间可以加上sleep)

死锁条件:有一个条件不成立,则不会产生死锁

1.互斥等待(有锁):一个资源一次只能被一个进程使用

2.持有锁并等待锁:一个进程因请求资源而阻塞时,对已获得的资源保持不放

3.循环等待:若干进程之间形成一种头尾相接的环形等待资源关系

4.无法剥夺的等待(有些锁有超时功能):进程获得的资源,在未完全使用完之前,不能强行剥夺

 

解决死锁只需要破除其中一个条件即可

  1. 破除互斥等待(一般没法破除)
  2. 破除持有并等待(一次性获取所有资源):拿一个锁并尝试拿第二个锁,拿不到则放掉第一个锁,等一段时间重新来一遍):程序设计的时候最好就设计好,不然以后更改很麻烦
  3. 破除循环等待(按顺序获取资源):比如对于账户A、B,他们有ID,规定操作这两个账户的线程必须按照ID值的大小获取,这样任何线程都必须得先获得A再获得B,而不是有一个先获得A,有一个先获得B(缺点:id并不一定可以用于排序,可能得强制加上一个可以排序的规则,当以后有其他属性加入,可能引入新的id,这样又得重新为该属性分配一个id来排序)
  4. 破除无法剥夺的等待(加入超时):不得已的方法,(缺点:用户体验不好,比如用户转账等了半天结果告诉你转账失败)

活锁

       是指线程1可以使用资源,但它很礼貌,让其他线程先使用资源,线程2也可以使用资源,但它很绅士,也让其他线程先使用资源。这样你让我,我让你,最后两个线程都无法使用资源。

扫描二维码关注公众号,回复: 3300525 查看本文章

饥饿

       类似于非公平锁机制,多个线程在等待资源的时候,有一个很早就在等待的线程一直获取不到锁,反而让后面来的线程获得了锁

猜你喜欢

转载自blog.csdn.net/qq_35642036/article/details/82801400
今日推荐