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