死锁和活锁详细介绍,实现原理

01 死锁 Deadlock

    死锁指两个以上线程永远处于阻塞状况,相互等对方释放锁    
    
    我们需要查看Java应用程序的线程转储。我们需要找出那些状态为BLOCKED的线程和他们等待的资源。每个资源都有一个唯一的id,用这个id我们可以找出哪些线程已经拥有了它的对象锁

02 死锁条件和解决方案

当满足下面4个条件,就会发生死锁,若有一个不满足就不会死锁

(1)  互斥条件   一个资源每次只能被一个线程使用
             解决方案: 如果业务允许,设置锁可以被多线线程获取    
             
(2)  占有与等待    线程本身占有资源,同时还有资源未得到满足,正在等待其他进程释放该资源
             解决方案:  一次性申请所有的资源,这样就不存在等待了
             优点: 简单安全
             缺点: 因为有些资源暂时无法获取,线程无法执行,已经获取到资源的任务无法执行,效率低,资源利用率低

(3)  不可抢占    线程已获得的资源,末使用完前不能强行剥夺释放,只能自己使用完后主动释放
              解决方案:  占用资源的线程申请其他资源时,若申请不到,主动释放占有的资源,或一定时间后释放,需要时再申请释放的资源
                               实现比较复杂,代价大,释放占有的资源可能会导致这个线程任务失效,反复申请释放资源导致线程的执行无限推迟

(4) 循环等待 若干进程之间形成一种头尾相接的循环等待资源关系
解决方案: 按序申请资源,资源有线性顺序的,申请时先申请序号小的,再申请序号大的, 所有线程按照相同顺序获得锁
线程2和线程3只有在获取了锁A之后才能尝试获取锁C ,因线程1已经拥有了锁A,所以线程2和3需要一直等到锁A释放。然后在它们尝试对B或C加锁之前,必须成功地对A加了锁。 这种方式需要知道所有可能会用到的锁

在这里插入图片描述


03 死锁检测

     当一个线程获取锁后,在Map等中进行记录
      当线程A获取锁失败后,可以查看当前的锁的占据者是否等待获取线程A占据的锁 
      如果循环嵌套死活,需要循环查询

04 若出现死锁了怎么解决

    (1)  终止占据资源的线程
                   撤销所有参与死锁的线程
                  逐步终止,先终止代价小的
  
   (2)  重启系统

05 死锁代码

第一条线程得到了锁一 进入阻塞状态
第二条线程得到了锁二 进入阻塞状态

第一条线程没有释放锁一 想获取锁二
第二条线程没有释放锁二 想获取锁一
这样程序就会卡住
还有一个守护线程由于其他两个线程处于死锁状态 就会一直执行
所以涉及程序的时候尽量不要嵌套

在这里插入图片描述


排查死锁


第一种
在Terminal中输入命令 jsp -l 先查出当前类的线程id
再输入命令 jstack 2988,可以在最后一行看到有提示死锁

Found 1 deadlock

第二种
在运行的地方搜索jconsole,选择进程对应的类,点连接,点击线程,点击检测死锁,会出现死锁的线程,点击线程会出现详细信息


活锁

任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。

若系统中有两个任务,它们总是因对方的行为而改变自己的状态, 那么就出现了活锁。最终结果是它们陷入了状态变更的循环而无法继续向下执行


线程A占有锁A请求锁B,进程B占有锁B请求锁A,处于死锁状态
线程发现获取不到锁,取消(回滚)并重新开始。线程A放弃占有锁A重新开始,线程B放弃占有锁B重新开始。则线程A和线程 B可能会出现重复不断的开始-回滚循环 称为活锁

如,有两个任务:任务1和任务2 ,它们都需要用到两个资源:资源1和资源2 。假设任务1对资源1加了一个锁,而任务2 对资源2 加了一个锁。当它们无法访问所需的资源时,就会释放自己的资源并且重新开始循环。这种情况可以无限地持续下去,所以这两个任务都不会结束自己的执行过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值