首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
如何确保N个线程可以访问N个资源同时又不导致死锁?
[问答题]
如何确保N个线程可以访问N个资源同时又不导致死锁?
添加笔记
求解答(0)
邀请回答
收藏(2241)
分享
纠错
59个回答
添加回答
23
西弗斯
多线程
产生死锁
的四个必要条件:
互斥条件:一个资源每次只能被一个进程使用。
保持和请求条件:一个进程因请求资源而阻塞时,对已获得资源保持不放。
不可剥夺***:进程已获得资源,在未使用完成前,不能被剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
只要破坏其中任意一个条件,就可以避免死锁,其中最简单的就是破环循环等待条件。按同一顺序访问对象,加载锁,释放锁。
发表于 2016-03-10 22:41:04
回复(3)
9
装逼小王子
预防死锁,预先破坏产生死锁的四个条件。互斥不可能破坏,所以有如下三种方法:
1.破坏请求和保持条件,
进程必须等所有要请求的资源都空闲时才能申请资源,这种方***使资源浪费严重(有些资源可能仅在运行初期或结束时才使用,甚至根本不使用).
允许进程获取初期所需资源后,便开始运行,运行过程中再逐步释放自己占有的资源,比如有一个进程的任务是把数据复制到磁盘中再打印,前期只需获得磁盘资源而不需要获得打印机资源,待复制完毕后再释放掉磁盘资源。这种方法比第一种方法好,会使资源利用率上升。
2.破坏不可抢占条件
这种方法代价大,实现复杂。
3.破坏循坏等待条件
对各进程请求资源的顺序做一个规定,避免相互等待。这种方法对资源的利用率比前两种都高,但是前期要为设备指定序号,新设备加入会有一个问题,其次对用户编程也有限制。
发表于 2017-07-25 12:35:25
回复(0)
3
Thas
破坏造成死锁的必要条件。线程互斥基本无法避免。
指定加锁顺序。所有线程按照相同的顺序获得资源的锁,不先获得顺序靠前的锁,无法获得后续的锁。则
先获得锁
的线程不会请求
后获得锁
的线程占用的资源,因为
后获得锁
的线程还没能获得
先获得锁
的线程未释放的锁,更无法占用
先获得锁
的线程还没获得的顺序靠后的锁。缺点:需要手动对锁的获得顺序进行分析。
指定加锁时限:线程指定超时时间,若无法获得锁的占用权,进行回退操作,并释放已占用的锁,经一段延时后再尝试进行任务。缺点 :线程过多的话,可能造成频繁回退,运行效率不高。
死锁检测:将线程和已获得锁的情况记录下来,定时检测是否所有死锁现象(线程循环等待现象),回退处于死锁状态的线程,延时后,重试这些线程,与添加加锁时限类似,缺点也同。
编辑于 2019-01-18 16:52:46
回复(0)
2
玄洪
题目说的答案明显没有可行性。有10个线程需要指明每个线程的执行顺序,假如有100个,1000个呢?
发表于 2020-02-04 22:34:19
回复(0)
2
小廿
银行家算法
发表于 2018-11-24 16:40:13
回复(0)
3
SmallWang
死锁,基本就是资源不够,互相需要对方资源却不肯放弃自身资源。N线程访问N资源,为了避免死锁,可以为其加锁并指定获取锁的顺序,这样线程按照顺序加锁访问资源,依次使用依次释放,可以避免死锁。
发表于 2016-08-25 15:48:47
回复(0)
1
荒漠
能否让其一次性获取,其所需要的资源,如果拿不全,就必须退回已近拿到的资源
发表于 2019-03-13 09:27:42
回复(2)
1
小新没有蜡笔~
所有线程按照指定顺序获取锁,释放锁
发表于 2016-10-17 15:08:27
回复(0)
1
阿里云弹性计算工程师
指定线程获取锁的顺序,并强制线程按照指定的方式获取和释放锁。当所有的线程都按顺序获取和释放锁时就不会发生死锁。
发表于 2016-06-17 13:54:23
回复(0)
1
dfsdocx
使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。
发表于 2015-10-29 12:10:41
回复(0)
61
吹过田野的风
多线程产生死锁需要四个条件,分别是互斥性,保持和请求,不可剥夺性还有要形成闭环,这四个条件缺一不可,只要破坏了其中一个条件就可以破坏死锁,其中最简单的方法就是
线程都是以同样的顺序加锁和释放锁,也就是破坏了第四个条件。
发表于 2016-01-11 21:15:04
回复(9)
0
Tod_
破坏死锁的四个必要条件其中之一: 1. 互斥条件(不可避免) 2. 不可剥夺条件 3. 请求与保持条件 4. 循环等待条件 其中对共享资源进行时,加锁解锁就是破坏第四个条件,最为简单方便
发表于 2021-03-13 08:11:32
回复(0)
0
我且随风前行
<p>所以进程以同样的方式加锁和解锁</p>
发表于 2020-12-08 17:45:49
回复(0)
0
牛客987453813号
https://blog.csdn.net/xuchenhuics/article/details/80011640。如何避免死锁,以及代码
发表于 2020-11-14 00:23:26
回复(0)
0
Assassin丶冷靖
最简单的办法就是使线程按顺序加锁和释放锁
发表于 2020-08-30 11:38:24
回复(0)
0
4A46
说了那么多理论,那么如何让线程按照指定顺序获取锁呢
发表于 2020-08-04 19:19:22
回复(1)
0
ღ᭄ꦿ九璃এ⁵²º᭄
1.破坏请求和保持条件,
进程必须等所有要请求的资源都空闲时才能申请资源,这种方***使资源浪费严重(有些资源可能仅在运行初期或结束时才使用,甚至根本不使用).
允许进程获取初期所需资源后,便开始运行,运行过程中再逐步释放自己占有的资源,比如有一个进程的任务是把数据复制到磁盘中再打印,前期只需获得磁盘资源而不需要获得打印机资源,待复制完毕后再释放掉磁盘资源。这种方法比第一种方法好,会使资源利用率上升。
2.破坏不可抢占条件
这种方法代价大,实现复杂。
3.破坏循坏等待条件
对各进程请求资源的顺序做一个规定,避免相互等待。这种方法对资源的利用率比前两种都高,但是前期要为设备指定序号,新设备加入会有一个问题,其次对用户编程也有限制。
发表于 2020-07-20 08:16:40
回复(0)
0
梢无球
死锁:线程拥有彼此继续执行所需要的锁 但又 彼此不释放,从而进入无限等待的状态。
发表于 2020-07-04 16:58:53
回复(0)
0
宋铁松
让线程按照指定的顺序获取或者释放锁可以避免死锁。
发表于 2020-07-01 16:47:20
回复(0)
0
小7小7万事如意
(问答题) 如何确保N个线程可以访问N个资源同时又不导致死锁? 使用多线程的时候,避免死锁的方式可以是:强制线程按照指定的顺序获取锁。如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。
编辑于 2020-06-24 18:46:12
回复(0)
这道题你会答吗?花几分钟告诉大家答案吧!
提交观点
问题信息
Java
上传者:
墨墨
难度:
59条回答
2241收藏
27245浏览
热门推荐
相关试题
编程题 ,按照要求创建Java 应...
Java
评论
(1)
3.1996至2003年间,从事高...
资料分析
言语理解与表达
资料分析
评论
(1)
电路板布线的时候尽量采用( )折线布线
PCB
评论
(1)
市场与销售的区别在哪里?
市场营销
评论
(1)
说出3个获取用户需求的方法并简述其...
用户研究
评论
(1)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题