iOS-多线程-死锁

所谓死锁,是指两个或两个以上的线程在执行过程中,因争夺资源(数据源、内存等,变量不是资源)而造成的一种相互等待的现象,若无外部处理作用,它们都将无限等待下去。

四个必备条件:

  • 互斥:所谓互斥就是线程在某一时间内独占资源。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
  • 请求与保持:指线程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
  • 不剥夺:指线程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
  • 环路等待:指在发生死锁时,必然存在一个线程——资源的环形链。

开发中碰到的死锁:

  1. 在GCD中,主要的死锁就是当前串行队列里面同步执行当前串行队列。解决的方法就是将同步的串行队列放到另外一个线程执行。
  2. 两个串行队列A、B,其中A是B的目标队列,这样队列之间会形成层级体系,B中的任务稍候都会在A中一次执行,于是排在AB中的任务都是在A中串行执行,这时如果在队列B中的块中,判断当前队列不是A那么就认为可以在队列A上执行同步派发操作,实际上会导致死锁。
    解决方案:队列特有数据。
  3. 互斥锁在已获得锁的情况下再次请求锁,线程会因为等待锁的释放而进入睡眠状态,因此就不可能再释放锁,从而导致死锁。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 7,787评论 1 17
  • 基础知识: 下面是五道面试题,写出打印结果(题目从别人那盗的,但是作者写的看不明白,用自己语言总结一下) 第一题:...
    LaurenceZi阅读 4,276评论 1 15
  • 前言 iOS开发中由于各种第三方库的高度封装,对锁的使用很少,刚好之前面试中被问到的关于并发编程锁的问题,都是一知...
    喵渣渣阅读 9,115评论 0 33
  • Java-Review-Note——4.多线程 标签: JavaStudy PS:本来是分开三篇的,后来想想还是整...
    coder_pig阅读 5,590评论 2 17
  • Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么? 1...
    AlanGe阅读 5,779评论 0 17