课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
在众多软件开发项目中,为了保障线程的安全性,一般我们都会使用锁这一功能,而今天我们就通过案例分析来了解一下,死锁的概念与应用注意事项。
1、什么是死锁
我们需要明确一下什么是死锁,造成死锁需要满足哪些条件,知道这些就可以轻松写出一段死锁代码了
死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程(线程)。
2、产生死锁的必要条件
互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。
3、预防死锁方法
资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
只要有一个资源得不到分配,也不给这个进程(线程)分配其他的资源:(破坏请保持条件)
可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
4、使用锁的一些注意事项
锁要用来锁定对应的访问资源,不同的资源使用不同的锁来访问限制
锁尽可能使用这样的格式privatereadonlyobject_locker=newobject();,是否使用static根据需要添加,多个资源有关联时,小心死锁的情况,一次全部分配,任意一个资源分配失败释放另外一个锁以避免死锁
实现分布式锁的时候指定大尝试时间,避免死锁避免长时间获取不到锁影响系统性能
在SQLServer中会有一个独立的死锁检测的进程,如果发生死锁的情况,会有一个事务会被选择为牺牲品来解决死锁的问题
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。