NSConditionLock
-
是对NSCondition的进一步封装。可以设置具体条件
dispatch_queue
- 直接使用GCD的串行队列,也可以实现线程同步
DISPATCH_QUEUE_SERIAL
dispatch_semaphore
- semaphore 信号量
- 信号量的初始值,可以用来控制线程并发访问的最大数量
-
信号量的初始值为1,代表同时只允许1条线程访问资源,保证线程同步
@synchronized
@synchronized 是对mutex递归锁的封装
//苹果不推荐使用 因为性能不好
@sychronized(self){
[self doSomething];
}
---------------------------
// 保证锁不变
static NSObject * lock;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
lock = [[NSObject alloc] init];
});
@synchronized(lock){
[self doSomething];
}
iOS线程同步方案性能比较
//更推荐使用 dispatch_semaphore 和 pthread_mutex
自旋锁 互斥锁 比较
- 什么情况使用自旋锁比较划算?
预计线程等待锁的时间很短
加锁的代码经常被调用,但竞争情况很少发生
CPU资源不紧张
多核处理器
- 什么情况使用互斥锁比较划算?
预计线程等待锁的时间较长
单核处理器
临界区有IO操作
临界区代码复杂或者循环量大
临界区竞争非常激烈的
atomic
- 保证getter setter 原子操作
- 相当于在getter和setter 内部加了线程同步的锁
- 并不能保证使用属性的过程是线程安全的
- iOS 上很少使用,因为频繁的调用会非常耗损性能
读写安全方案
pthread_rwlock 读写锁
-
等待锁的线程会进入休眠
dispatch_barrier_async
- 这个函数传入的并发队列必须是自己通过dispatch_queue_create创建的
-
如果传入的是一个串行或是一个全局的并发队列,那这个函数便等同于dispatch_async函数的效果