likes
comments
collection
share

《新浪微博剖析 iOS 高级面试》笔记(六):多线程相关面试问题

作者站长头像
站长
· 阅读数 29

我的Github地址

小码哥《恋上数据结构与算法》笔记

极客时间《iOS开发高手课》笔记

iOS大厂面试高频算法题总结

iOS面试资料汇总

GCD

1、同步/异步 & 串行/并发

a、同步串行

《新浪微博剖析 iOS 高级面试》笔记(六):多线程相关面试问题

b、死锁原因

《新浪微博剖析 iOS 高级面试》笔记(六):多线程相关面试问题

  • 死锁是因为队列引起的循环等待,而非线程。
    • 首先在主线程执行主队列中的viewDidLoad函数。
    • 当执行到block时,因为是同步,所以需要hold住主线程主队列正在执行的viewDidLoad函数,等执行完主队列block内部代码后,再执行主线程主队列viewDidLoad函数。
    • 所以出现了viewDidLoad等待block的情况。
    • block内的代码要执行,必须等待队列中其他函数执行完,即先进先出
    • 所以出现了block等待viewDidLoad的情况。
    • 最终两个函数相互等待,出现造成死锁《新浪微博剖析 iOS 高级面试》笔记(六):多线程相关面试问题
  • 上面这种用法没问题
    • 首先在主线程执行主队列中的viewDidLoad函数。
    • 当执行到block时,因为是同步,所以需要hold住主线程主队列正在执行的viewDidLoad函数,等执行完主队列block内部代码后,再执行主线程主队列viewDidLoad函数。
    • 所以出现了viewDidLoad等待block的情况。
    • block内部的代码会在serialQueue的队列中取出,因为serialQueueblock排在最前,所以block会被立即取出,并在主线程中执行。
    • block执行完毕,会执行viewDidLoad剩余代码。

《新浪微博剖析 iOS 高级面试》笔记(六):多线程相关面试问题

  • 因为是并发队列,所以运行队列中的任务一起执行,不需要等待上一个任务执行完再执行下一个,所以不会死锁
  • 如果global_queue换成串行队列,就会产生死锁

c、异步串行

《新浪微博剖析 iOS 高级面试》笔记(六):多线程相关面试问题

  • 先执行完viewDidLoad,再执行block内的代码。 《新浪微博剖析 iOS 高级面试》笔记(六):多线程相关面试问题
  • 因为子线程默认没有开启runloopperformSelector无法执行。

2、dispatch_barrier_async

a、怎样利用GCD实现多读单写?

《新浪微博剖析 iOS 高级面试》笔记(六):多线程相关面试问题 《新浪微博剖析 iOS 高级面试》笔记(六):多线程相关面试问题

  • 读的时候使用dispatch_sync,是因为使用同步队列可以在赋值结束后,再执行返回值的操作。

3、dispatch_group

a、使用GCD实现A、B、C三个任务并发,完成后执行任务D。

《新浪微博剖析 iOS 高级面试》笔记(六):多线程相关面试问题 《新浪微博剖析 iOS 高级面试》笔记(六):多线程相关面试问题

NSOperation

1、优势、特点

  • 添加任务依赖
  • 任务执行状态控制
  • 最大并发量

2、任务状态

  • isReady
  • isExecuting
  • isFinished
  • isCancelled

3、任务状态控制

  • 如果只重写main方法,底层控制变更任务执行完成状态,以及任务退出。
  • 如果重写了start方法,自行控制任务状态。

a、系统是怎样移除一个isFinished=YESNSOperation的?

  • KVO

NSThread

1、NSThread启动流程

《新浪微博剖析 iOS 高级面试》笔记(六):多线程相关面试问题

多线程与锁

  • os_unfair_lock
  • OSSpinLock
    • 循环等待询问,不释放当前资源
    • 用于轻量级数据访问,简单的int值 +1/-1操作
  • dispatch_semaphore
  • pthread_mutex
  • dispatch_queue(DISPATCH_QUEUE_SERIAL)
  • NSLock
  • NSCondition
  • pthread_mutex(recursive)
  • NSRecursiveLock
  • NSConditionLock
  • @synchronized
    • 一般在创建单例对象的时候使用,保证在多线程环境下,创建是唯一的。

1、NSLock死锁问题

《新浪微博剖析 iOS 高级面试》笔记(六):多线程相关面试问题

  • 可以使用NSRecursiveLock递归锁来解决该问题。 《新浪微博剖析 iOS 高级面试》笔记(六):多线程相关面试问题

多线程面试问题总结

  • 怎样用GCD实现多读单写?
  • iOS系统为我们提供的几种多线程技术各自的特点是怎样的?
    • AFNetworking & SDWebImage 使用NSOperation,因为可以控制线程状态。
  • 系统是怎样移除一个isFinished=YESNSOperation的?
  • 你都用过哪些锁?结合实际谈谈你是怎样使用的?
转载自:https://juejin.cn/post/6901562047965134861
评论
请登录