NSConditionLock
-
是對NSCondition的進一步封裝??梢栽O置具體條件
image.png
dispatch_queue
- 直接使用GCD的串行隊列,也可以實現線程同步
DISPATCH_QUEUE_SERIAL
dispatch_semaphore
- semaphore 信號量
- 信號量的初始值,可以用來控制線程并發(fā)訪問的最大數量
-
信號量的初始值為1,代表同時只允許1條線程訪問資源,保證線程同步
image.png
@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線程同步方案性能比較

image.png
//更推薦使用 dispatch_semaphore 和 pthread_mutex
自旋鎖 互斥鎖 比較
- 什么情況使用自旋鎖比較劃算?
預計線程等待鎖的時間很短
加鎖的代碼經常被調用,但競爭情況很少發(fā)生
CPU資源不緊張
多核處理器
- 什么情況使用互斥鎖比較劃算?
預計線程等待鎖的時間較長
單核處理器
臨界區(qū)有IO操作
臨界區(qū)代碼復雜或者循環(huán)量大
臨界區(qū)競爭非常激烈的
atomic
- 保證getter setter 原子操作
- 相當于在getter和setter 內部加了線程同步的鎖
- 并不能保證使用屬性的過程是線程安全的
- iOS 上很少使用,因為頻繁的調用會非常耗損性能
讀寫安全方案

image.png

image.png
pthread_rwlock 讀寫鎖
-
等待鎖的線程會進入休眠
image.png
dispatch_barrier_async
- 這個函數傳入的并發(fā)隊列必須是自己通過dispatch_queue_create創(chuàng)建的
-
如果傳入的是一個串行或是一個全局的并發(fā)隊列,那這個函數便等同于dispatch_async函數的效果
image.png



