20200408——操作系统 线程死锁

前言

关于死锁(DeadLock)有很多个方面,主要是操作系统方面的死锁,mysql数据库的死锁,还有编程的时候应该也归于操作系统的死锁。

死锁概述

线程死锁是指两个或两个以上的线程互相持有对方所需要的资源,由于synchronized的特性,一个线程持有一个资源,或者说获得一个锁,在该线程释放这个锁之前,其它线程是获取不到这个锁的,而且会一直死等下去,因此这便造成了死锁。

死锁产生的四个条件

互斥条件:一个资源,或者说一个锁只能被一个线程所占用,当一个线程首先获取到这个锁之后,在该线程释放这个锁之前,其它线程均是无法获取到这个锁的。

占有且等待:一个线程已经获取到一个锁,再获取另一个锁的过程中,即使获取不到也不会释放已经获得的锁。

不可剥夺条件:任何一个线程都无法强制获取别的线程已经占有的锁

循环等待条件:线程A拿着线程B的锁,线程B拿着线程A的锁。。

如何避免死锁

其实如果避免死锁,最基本的思想从死锁产生的四个条件来看,破坏四个条件即可。

打破占有并等待条件:可以实行资源预先分配策略(进程在运行前一次性向系统申请它所需要的全部资源,若所需全部资源得不到满足,则不分配任何资源,此进程暂不运行;只有当系统能满足当前进程所需的全部资源时,才一次性将所申请资源全部分配给该线程)或者只允许进程在没有占用资源时才可以申请资源(一个进程可申请一些资源并使用它们,但是在当前进程申请更多资源之前,它必须全部释放当前所占有的资源)。但是这种策略也存在一些缺点:在很多情况下,无法预知一个进程执行前所需的全部资源,因为进程是动态执行的,不可预知的;同时,会降低资源利用率,导致降低了进程的并发性。

打破非抢占条件:允许进程强行从占有者哪里夺取某些资源。也就是说,但一个进程占有了一部分资源,在其申请新的资源且得不到满足时,它必须释放所有占有的资源以便让其它线程使用。这种预防死锁的方式实现起来困难,会降低系统性能。

打破循环等待条件:实行资源有序分配策略。对所有资源排序编号,所有进程对资源的请求必须严格按资源序号递增的顺序提出,即只有占用了小号资源才能申请大号资源,这样就不回产生环路,预防死锁的发生。

死锁检测

在发生死锁之后,程序就卡住了没有任何反应,但程序仍在运行,因此需要借助一些

在工作环境,可以直接在jvm的虚拟上,运行jstack -l 端口号 >mmz.dump
这样,就会保存当前状态的快照,用来判断死锁问题的话,建议等待一段时间在进行一次jstack,通过比较来看死锁的问题。通过阿里内部的平台,可以看到多线程情况,线程在获取哪个锁,在等待哪个锁,如果前后,锁一直没有释放,那么就是问题所在。如果不借助了工具,记得可以直接打开dump文件,可以看到系统有没有判断当前有死锁的条件出现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值