时间:2021-05-20
什么是线程死锁
是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
线程死锁怎么发生
发生死锁的情况一般是两个对象的锁相互等待造成的。
死锁发生的条件
1、互斥条件:所谓互斥就是进程在某一时间内独占资源。
2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3、不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
死锁通常是一个线程锁定了一个资源A,而又想去锁定资源B;在另一个线程中,锁定了资源B,而又想去锁定资源A以完成自身的操作,两个线程都想得到对方的资源,而不愿释放自己的资源,造成两个线程都在相互等待,造成了无法执行的情况。
线程死锁产生的原因:在一个串行队列的任务中,再向这个队列添加同步任务。
典型例子:
我们分析一下:
主队列main_queue是一个串行队列,串行队列的特点就是队列中所有任务必须顺序执行。也就是说必须按照添加到队列中的先后顺序执行。
我们再看一张图:
我们在代码中使用dispatch_sync()函数给主队列添加了一个同步任务:
也就是说后添加的同步任务5是在viewDidLoad任务2之后,只有等待任务2执行完之后才能执行任务5,这就是串行队列的特点。但是任务5是一个同步任务,必须等任务5执行完才能执行其它任务,因此造成互相等待的死锁。
再看一个例子
我们知道GCD分为同步任务和异步任务,最开始的例子是主线程的主队列,相当于是一个同步任务。而这个例子证明了,即便是在异步任务只要任务队列是串行队列,在串行队列的任务中再向队列添加同步任务,就会造成死锁,关键点不是同步还是异步,而是串行队列。
总结
dispatch_sync()函数会阻塞线程。当前队列是串行队列,任务必须顺序执行。在串行队列的任务A中给这个队列添加同步任务B,相当于说这个串行队列又多了一个任务B,任务B如果想要执行必须等待任务A执行完,但是任务B是同步任务,必须等任务B执行完才能执行其它任务,所以任务AB互相等待,造成死锁。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文介绍了Java中常见死锁与活锁的实例详解,分享给大家,具体如下:顺序死锁:过度加锁,导致由于执行顺序的原因,互相持有对方正在等待的锁资源死锁:多个线程在相同
java多线程死锁相信有过多线程编程经验的朋友,都吃过死锁的苦。除非你不使用多线程,否则死锁的可能性会一直存在。为什么会出现死锁呢?我想原因主要有下面几个方面:
IOS创建并发线程的实例详解创建并发线程主线程一般都是处理UI界面及用户交互的事儿的。其他的事一般就要另外的线程去处理,如下载,计算等。。。现在先简单创建3个线
1.死锁死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。Java死锁产生的四
本文实例演示了Java多线程死锁。分享给大家供大家参考,具体如下:packagecom.damlab.fz;publicclassDeadLock{public