1. GCD
1. 同步/异步 串行/并发
dispatch_sync(serial_queue, ^{//任务})
dispatch_async(serial_queue, ^{//任务})
dispatch_sync(concurrent_queue, ^{//任务})
dispatch_async(concurrent_queue, ^{//任务})
复制代码
- 死锁
- 原因
- 队列引起的循环等待
- 主队列中所提交的任务无论是同步方式还是异步方式,都要在主线程中执行
- 同步提交的任务,不论是提交到并发还是串行队列,都在当前线程执行
2. dispatch_barrier_async
3. dispatch_group
// 创建一个group
dispatch_group_t group = dispatch_group_create();
// for循环遍历各个元素执行操作
for (NSURL *url in arrayURLs) {
// 异步组分派到并发队列当中
dispatch_group_async(group, concurrent_queue, ^{
//根据url去下载图片
NSLog(@"url is %@", url);
});
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 当添加到组中的所有任务执行完成之后会调用该Block
NSLog(@"所有图片已全部下载完成");
});
复制代码
2. NSOperation
配合NSOperationQueue实现多线程方案
- 特点
- 可以添加任务依赖
- 任务执行状态控制
- 状态
- isReady
- isExecuting
- isFinished
- isCancelled
- 如果只重写main方法,底层控制变更任务执行完成状态,以及任务退出
- 如果重写了start方法,自行控制任务状态
- 最大并发量
- 支持KVO
3. NSThread
- 启动流程
- 结合Runloop实现常驻线程
- Start方法
4. 多线程与锁
- iOS中的锁
- @synchronized
- atomic
- 修饰属性的关键字
- 对被修饰对象进行原子操作(不负责使用)
- OSSpinLock
- 自旋锁
- 循环等待询问,不释放当前资源
- 用于轻量级数据访问,简单的int值+1/-1操作
- NSLock
- NSRrecursiveLock - 递归锁
- dispatch_semaphore_t - 信号量
- dispatch_semaphore_create(1)
- dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
- dispatch_semaphore_signal(semaphore)
转载于:https://juejin.im/post/5cd44264f265da0379419326