- GCD
- NSOperation
- NSThread
- 多线程与锁
一、GCD
- 同步、异步 和 串行、并发
- dispatch_barrier_async(异步栅栏调用,解决多读单写问题)
- dispatch_group
1、同步、异步 和 串行、并发

image
同步串行
问题1:

image
原因:队列引起的循环等待

image
问题2:

image
分析:

image
问题3:

image
异步串行
异步并发
问题1:

image
分析:GCD下没有对应的RunLoop的,而performSelector方法会在对应的RunLoop下执行,又此时无对应的RunLoop,所以会失效
2、dispatch_barrier_async
问题:怎样利用GCD实现多读单写

image
模型:

image
解决代码:

image

image
3、dispatch_group
问题:使用GCD实现,A、B、C三个任务并发,完成后执行任务D?
代码:

image

image
二、NSOperation
需要和 NSOperationQueue 配合使用来实现多线程方案
- 添加任务依赖
- 任务执行状态控制
- 可以控制最大并发量
1.任务执行状态控制
哪些状态?
- isReady
- isExecuting
- isFinished
- isCancelled
状态的控制:
- 如果只重写main方法,底层控制变更任务执行完成状态,以及任务退出
- 如果重写了start方法,自行控制任务状态
问题:系统是怎样移除一个 isFinished = YES 的 NSOperation?
解答:通过KVO;
三、NSThread
启动流程:

image
Start方法实现原理:
- 内部创建了一个 pthread 线程,当执行的 tatrget 的 selctor 方法执行时,系统会进行线程的退出操作
- 如果想维持一个常驻线程,需要在 NSThread 对应的 selector 方法中维护一个 RunLoop 时间循环
四、多线程与锁
iOS中常用的锁:
- @synchronize
- atomic
- OSSpinLock
- NSRecursiveLock
- NSLock
- dispatch_semaphore_t
@synchronize
- 一般在创建单例对象的时候使用,来保证多线程情况下创建对象唯一
atomic
- 修饰属性关键字
- 对被修饰的对象进行原子操作(不负责使用)

image
OSSpinLock
- 自旋锁,循环等待询问,不释放当前资源
- 用于轻量级数据访问,例如简单的 int 值 +1/-1 操作
NSLock
- 一般用来解决线程同步问题
问题:

image
解决:-- NSRecursiveLock 递归锁

image
dispatch_semaphore_t
相关函数:

image
1、dispatch_semaphore_create()

image
2、dispatch_semaphore_wait()

image
3、dispatch_semaphore_sigal()

image
总结:
- 怎样用GCD实现多读单写?
- 几种多线程技术和各自的特点?
- NSOperation 对象在 Finished 之后怎样从 queue 中移除的?
- 用过哪些锁?怎样使用的?