GCD
-
同步异步, 串行并发
- 同步串行:
dispatch_sync(serial_queue, ^{ // work; })
-
serial_queue线程同步
-
主线程同步串行
-
产生死锁的原因
-
- 异步串行:
dispatch_async(serial_queue, ^{ // work; })
- 同步并发:
dispatch_sync(concurrent_queue, ^{ // work; })
- 异步并发:
dispatch_async(concurrent_queue, ^{ // work; })
-
performSelector..方法的内部逻辑(13)
- 当perform...afterDelay:方法的内部实现, 是向当前线程的Runloop中添加事件, 因为GCD底层没有提供runloop, 所以该方法不会被执行
-
- 同步串行:
-
dispatch_barrier_async: 异步栅栏调用, 用来处理多读单写系统层级的解决方案
- 怎样实现多读单写? 怎样利用GCD实现多读单写?(多线程对于共享数据的访问问题)
-
读与读并发, 读与写互斥, 写与写互斥
-
异步栅栏实现多读单写
-
-
dispatch_group的使用和理解:
-
dispatch_group的使用场景
-
dispatch_group代码示例
-
NSOperation
-
- 实现多线程的优势和特点:
- 可以为任务添加依赖
- 任务的执行状态控制
- 可以控制哪些任务状态?
- isReady: 当前任务是否处于就绪状态
- isExecuting: 正在执行中
- isFinished: 是否已完成
- isCancel: 是否已取消
- 可以控制哪些任务状态?
-
- 状态控制
- 如果只重写main方法, 底层控制变更任务执行完成状态, 以及任务退出
- 如果重写start方法, 自行控制任务状态, 因为在start方法, 系统帮我们控制了任务的状态
-
- 系统是如何移除一个isFinished=YES的NSOperation的?
- 通过KVO
- 可以设置最大并发量
NSThread
![](https://img.haomeiwen.com/i1743129/16b4bf613ef0bb91.png)
-
- 内部实现机制:
-
创建一个线程
-
通知Observer当前线程已经启动, 设置线程名称, 调用main函数, 在调用exit关系线程(所以需要在main中的SEL中添加一个runloop的循环)
-
main函数
多线程与锁
- 锁的分类:
- @synchronized: 在创建单例对象的时候使用, 来保证再多线程的情况下创建对象是唯一的
- 在创建单例对象的时候使用, 来保证再多线程的情况下创建对象是唯一的
- 创建一个常驻线程的时候需要对线程进行加锁
- atomic: 属性关键字; 对被修饰的对象进行原子操作, 不负责使用, 负责赋值
- OSSpinLock: 自旋锁 -> 循环等待询问, 不释放当前资源; 用于轻量级数据访问, 简单的int值+/-操作
- NSLock: 解决细粒度的线程同步问题,来保证各个线程互斥, 来进入自己的临界区
-
1-nslock.png
-
- NSRecursiveLock: 递归锁, 可以重入
-
1-NSRecursiveLock.png
-
- dispach_semaphore_t: 信号量
-
1-dispach_semaphore_t.png
-
dispach_semaphore_create()
: 结构体中包含 信号量的值 和 线程列表-
dispach_semaphore_create流程
-
-
dispach_semaphore_wait(semaphore, DIS)
:-
dispach_semaphore_wait内部流程
-
-
dispach_semaphore_singal() :
-
1-dispach_semaphore_singal.png
-
-
- @synchronized: 在创建单例对象的时候使用, 来保证再多线程的情况下创建对象是唯一的
多线程面试总结
- 怎样利用GCD实现多读单写?
- iOS为我们提供的几种多线程技术各自都有哪些特点?
- NSOperation对象在Finished之后是怎样从queue中移除的?
- 你都用过哪些锁, 结合实际谈谈你是如何使用的? !!!!
网友评论