多线程 - 同步方案一
多线程的安全隐患
- 资源共享
- 1块资源可能会被多个线程共享,也就是
多个线程可能会访问同一块资源 - 比如多个线程访问同一个对象、同一个变量、同一个文件
- 1块资源可能会被多个线程共享,也就是
- 当多个线程访问同一块资源时,很容易引发
数据错乱和数据安全问题
多线程的安全隐患的解决方案
- 解决方案:使用
线程同步技术(同步,就是协同步调,按预定的先后次序进行) - 常见的线程同步技术是:
加锁
iOS中的线程同步方案
- OSSpinLock
- os_unfair_lock
- pthread_mutex
- dispatch_semaphore
- dispatch_queue(DISPATCH_QUEUE_SERIAL)
- NSLock
- NSRecursiveLock
- NSCondition
- NSConditionLock
- @synchronized
OSSpinLock
- OSSpinLock叫做”自旋锁”,等待锁的线程会处于忙等(busy-wait)状态,一直占用着CPU资源
- 目前已经不再安全,可能会出现优先级反转问题
- 如果等待锁的线程优先级较高,它会一直占用着CPU资源,优先级低的线程就无法释放锁
- 需要导入头文件#import <libkern/OSAtomic.h>
用法:
1 | //初始化 |
示例:
1 |
|
os_unfair_lock
- os_unfair_lock用于取代不安全的OSSpinLock ,从iOS10开始才支持
- 从底层调用看,等待os_unfair_lock锁的线程会处于休眠状态,并非忙等
- 需要导入头文件#import <os/lock.h>
用法
1 | //初始化 |
示例:
1 |
|
pthread_mutex
- mutex叫做”互斥锁”,等待锁的线程会处于休眠状态
- 需要导入头文件#import <pthread.h>
用法
1 | // 初始化锁属性 |
示例:
1 |
|
pthread_mutex – 递归锁
1 | /* |
示例:
1 |
|
pthread_mutex – 条件
用法
1 | // 初始化锁 |
示例:
1 |
|
NSLock、NSRecursiveLock
NSLock是对mutex普通锁的封装NSRecursiveLock也是对mutex递归锁的封装,API跟NSLock基本一致
用法
1 | @interface NSLock: NSObject<NSLocking> { |
示例:
1 |
|
参考
李明杰老师课件- objc源码
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ivan's Blog!
评论







