六、多线程

注:本文集为自己准备面试时,系统复习的笔记,如大家有兴趣,欢迎阅读并指正

1.GCD

  • 同步/异步 和 串行/并发
    • 同步串行。在主线程运行
    • 同步并行。
    • 异步串行。
    • 异步并行。
  • dispatch_barrier_async
    • 实现多读单写?
      读者、读者并发
      读者、写者互斥
      写者、写者互斥
-(id)objectForKey:(NSString *)key {
  __block id obj;
  dispatch_sync(concurrent_queue,^{
    obj = [userCenterDic objectForKey:key];
  });
  return obj;
}

- (void)setObject:(id)obj forKey:(NSString *)key {
  // 异步栅栏调用设置数据
  dispatch_barrier_async(concurrent_queue,^{
    [userCenterDic setObject:obj forKey:key];
  });
}
  • dispatch_group_async()
    使用GCD实现需求:A、B、C三个任务并发,完成后在执行任务D?

2.NSOperation

需要和NSOperationQueue配合使用实现多线程方案

  • 添加任务依赖
  • 任务执行状态控制
    • 可以控制哪些装态?
      isReady 、isExecuting、isFinished、 isCancelled
      如果只重写main方法,底层控制变更任务执行完成状态,以及任务退出。
      如果重写了start方法,自行控制任务状态
  • 最大并发量

3.NSThread:实现常驻线程

启动线程
start() - 创建pthread - main() - [target perfomSelector: withObject: ] - exit()

4.多线程与锁:线程同步和资源共享

  • iOS有哪些锁?
    • @synchronized:用来创建单例对象的时候使用。保证多线程创建对象唯一
    • atomic:属性关键字,保障赋值操作线程安全
    • OSSpinLock:自旋锁,循环等待询问,不释放当前资源。专门用于轻量级数据访问,简单的+1/-1操作
    • NSLock:如果重入会出现死锁问题,需要使用递归锁。
    • NSRecursiveLock:递归锁
    • dispatch_semaphore_t:信号量
      • dispatch_semaphore_create();
      • dispatch_semaphore_singal();
5.补充
  • 线程各自特点?
    GCD:简单的线程同步,子线程分派,多读单写问题解决
    NSOperation:AFN,SDW。方便任务的状态控制,添加依赖,移除依赖
    NSThread:常驻线程。

  • [self performSelector:withObject:afterDelay]:方法要被执行需要有runloop支持,子线程中执行该方法可能没有启动runloop导致该代码不执行。

  • NSOperation对象在Finished之后是怎样从queue当中移除掉的?
    通过KVO方式将对象从queue中移除

  • 你都用过哪些锁?结合实际谈谈你是怎样使用的?
    NSLock、dispatch_semaphore_signal

你可能感兴趣的:(六、多线程)