死锁是指两个或两个以上的线程(进程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程(进程)称为死锁线程(进程)。
看个新闻先:
- 2019年7月4日,英国皇家海军陆战队派出约30名突击队员,在直布罗陀港口和执法机构的配合下,在直布罗陀附近水域扣押一艘满载200万桶伊朗原油的超级油轮“格蕾丝一号”,并指认其涉嫌向叙利亚运送原油,违反欧盟对叙利亚的制裁。事发后,伊朗表达强烈抗议,称扣押行为是“非法举措”,并向英国政府提出严正交涉。
- 伊朗伊斯兰革命卫队发表声明称,当地时间2019年7月19日下午,伊朗海军在霍尔木兹海峡扣押一艘英国油轮,称其违反国际海事法。声明指出,伊朗海军是在接到伊朗南部霍尔木兹甘省港口及海事局要求后按国际法规扣押油轮。目前,这艘油轮已被导航到港口接受检查和进行相关法律程序。
伊朗说,你放了我们的格蕾丝,我们就放了你们的Stena Impero;英国说,你放了我们的Stena Impero,我们再聊聊你们的格蕾丝。谁都不松手,都担心对方搞出什么事情,就那么僵持着等待着,这就可以看成产生了死锁。
其实死锁也不是那么容易产生的,他需要满足一定的条件(同时满足):
- 互斥条件:指线程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个线程占用。如果此时还有其它线程请求资源,则请求者只能等待,直至占有资源的线程用毕释放。
- 请求和保持条件:指线程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它线程占有,此时请求线程阻塞,但又对自己已获得的其它资源保持不放。
- 不剥夺条件:指线程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
- 环路等待条件:指在发生死锁时,必然存在一个线程——资源的环形链,即线程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
既然我们已经知道了死锁发生的条件了,那我们就人为的避免某个条件产生。解决死锁问题的关键就在于产生死锁的条件中!