java 什么是死锁_牛客网Java刷题知识点之什么是死锁、死锁产生的4个必要条件...

20160424132138_7975.png

不多说,直接上干货!

https://www.nowcoder.com/ta/review-java/review?query=&asc=true&order=&page=16

a2db5f9d42b30cf0e2c2052a0ac2f2f6.png

什么是死锁?

①、死锁:线程a占有资源a,线程b占有资源b,线程a申请占有资源b,同时要求占有资源b之后才释放资源a,而线程b申请占有资源a,同时要求占有资源a之后才释放资源b,这样两个线程互相永久等待对方释放资源,这就是死锁。1 定义: 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,形成线程的死锁。死锁产生的现场:当a进程p s2信号量而b进程p s1信号量时就会产生死锁,因为s2信号量需要b进程释放,而s1信号量需要a进程释放,因此两个进程都在等相互的资源,造成死锁。

死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。

67ceff1f8ba1c8586416a0a8a2af66d3.png

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足

产生死锁的原因主要是:

(1) 因为系统资源不足。

(2) 进程运行推进的顺序不合适。

(3) 资源分配不当等。

死锁产生的4个必要条件:

a674330a5db75924ca10acaae2cd25ec.png

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

死锁的四个条件 :1、互斥 2、保持锁并请求锁 3、不可抢夺 4、循环等待

产生死锁的四个必要条件:

(1) 互斥条件:一个资源每次只能被一个进程使用。

(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

10bef5e36ff1267f037e8b4facd213ba.png

(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之

一不满足,就不会发生死锁。

死锁的解除与预防

理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态

的情况下占用资源。因此,对资源的分配要给予合理的规划。

4fbrarvrgxm11.jpg

预防死锁,预先破坏产生死锁的四个条件。互斥不可能破坏,所以有如下三种方法:

1、破坏请求和保持条件,

进程必须等所有要请求的资源都空闲时才能申请资源,这种方法会使资源浪费严重(有些资源可能仅在运行初期或结束时才使用,甚至根本不使用)。

允许进程获取初期所需资源后,便开始运行,运行过程中再逐步释放自己占有的资源,比如有一个进程的任务是把数据复制到磁盘中再打印,前期只需获得磁盘资源而不需要获得打印机资源,待复制完毕后再释放掉磁盘资源。这种方法比第一种方法好,会使资源利用率上升。

2、破坏不可抢占条件

这种方法代价大,实现复杂。

3、破坏循坏等待条件

首先给系统中的资源编号,规定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。在采用这种分配策略时,一旦进程已获得某种设备资源后便阻塞,使它不可能再请求任何资源,而在它运行时又不保持任何资源。安全性算法,就我理解就是假设在为当前请求进程分配资源后保证至少有一个进程可以获得需要的最大资源,这样就可以保证该系统始终存在进程可获得最大资源,满足该条件即可为当前请求的进程分配资源。

死锁,基本就是资源不够,互相需要对方资源却不肯放弃自身资源。N线程访问N资源,为了避免死锁,可以为其加锁并指定获取锁的顺序,这样线程按照顺序加锁访问资源,依次使用依次释放,可以避免死锁。

在获取锁的时候如果有线程在访问数据,就会获取失败,这时候线程会等待, 直到访问数据的那个线程释放锁。为每一个共享资源创建一个lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁,则当前线程需等待其被释放),待资源访问完后,再调用release方法释放锁:。这里即保证了其他线程b对获取到初始化锁的线程a的重排序不可见,即线程a进入类的初始化并将status设置为正在初始化,当线程b进入初始化队列时java多线程死锁,会获取到a设置的status并乖乖等待,直到a初始化结束后将status设置为初始化结束释放锁并唤醒其他等待线程,到这里a的初始化过程完成,b才被唤醒并获取锁接着读取status为初始化结束,b直接释放锁,到这里线程b的初始化过程完成。

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-107574-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值