1. os_unfair_lock
互斥鎖
- 需要導入
#import <os/lock.h>
- 取代不安全的
SSpriLock
,從iOS 10
才開始支持 - 底層等待的鎖的線程,不會盲等伏蚊,線程會處于休眠狀態(tài)馅巷。
os_unfair_lock lock = OS_UNFAIR_LOCK_INIT;
os_unfair_lock_lock(&lock);
os_unfair_lock_unlock(&lock);
2.OSSpinLock
自旋鎖
- 需要引入頭文件
#import <libkern/OSAtomic.h>
,并且在ios 10
以后就不建議使用 - 它是個自旋鎖
- 自旋鎖只要有一個線程鎖住后膛虫,其他線程會盲等(循環(huán)等待)鎖,那個線程搶到那個線程就會執(zhí)行
- 會造成優(yōu)先級反轉(zhuǎn)問題
- 如果等待鎖的優(yōu)先級比較高钓猬,它會一直占用CPU資源稍刀,優(yōu)先級低的線程無法釋放鎖
// 初始換一個lock
OSSpinLock lock = OS_SPINLOCK_INIT;
// 開始鎖
OSSpinLockLock(&lock);
// 解鎖
OSSpinLockUnlock(&lock);
3.dispatch_semaphore
信號量
- 我們可以設置
dispatch_semaphore
的value
,來設置最大的并發(fā)數(shù)敞曹,當我們設置為1的時候账月,則可以代表鎖來使用
dispatch_semaphore_t semaphonre = dispatch_semaphore_create(1);
// wait 表示當信號值 > 0的時候通過,且信號值-1,
// 當信號值 <= 0時澳迫,表示等待,只到信號值 > 0 重復上一句
dispatch_semaphore_wait(semaphonre, DISPATCH_TIME_FOREVER);
// signal 表示信號值 +1
dispatch_semaphore_signal(semaphonre);
/**
DISPATCH_TIME_FOREVER: 表示永久等待
DISPATCH_TIME_NOW: 表示不等待
*/
4. pthread_mutex
互斥鎖
-
mutex
為互斥鎖局齿,等待鎖的線程會處于休眠狀態(tài)。 - 需要導入頭文件
#import <pthread.h>
-
條件
當時用條件等待的時候會放開當前持有的鎖纲刀,等待signal或者broadcast
后,再重新持有鎖担平,繼續(xù)執(zhí)行代碼 - 里面分為示绊,默認鎖和遞歸鎖。遞歸鎖需要設置
mutexattr
的type為PTHREAD_MUTEX_RECURSIVE
-
注意: 創(chuàng)建的
mutex暂论、attr面褐、cond
等在不實用的時候,需要調(diào)用響應的dispose
方法進行銷毀
// 初始化屬性
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr)
// 設置屬性
/*
PTHREAD_MUTEX_NORMAL 默認
PTHREAD_MUTEX_RECURSIVE 遞歸鎖
PTHREAD_MUTEX_ERRORCHECK 錯誤鎖
*/
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);
// 初始化鎖
pthread_mutex_t mutex = {0};
// 第二個參數(shù)也可以填寫為null取胎,表示初始話一個默認的??
pthread_mutex_init(&mutex,&attr);
// 銷毀類型
pthread_mutexattr_destroy(&attr);
// 初始化條件
pthread_condattr_t condattr;
pthread_condattr_init(&condattr);
// 第二個參數(shù)也可以填寫null,初始化一個默認的添加
pthread_cond_init(&_cond, &condattr);
// 加??
pthread_mutex_lock(&_mutex);
// 解鎖
pthread_mutex_unlock(&_mutex);
// 條件等待
pthread_cond_wait(&_cond, &_mutex);
// 放開其中一個鎖
pthread_cond_signal(&_cond);
// 發(fā)送一個廣播展哭,放開所有等待的鎖
pthread_cond_broadcast(&_cond);
5.NSLock
- 是對
pthread_mutex
普通(默認)鎖的一個Objective-c
的一個封裝。 - 是一個互斥鎖闻蛀。
// 嘗試加鎖
- (BOOL)tryLock;
// 在這個時間之前加鎖匪傍,如果加鎖成功,則返回yes觉痛,不成功則為false
- (BOOL)lockBeforeDate:(NSDate *)limit;
- (void)lock;
- (void)unlock;
注意:NSLock
在上一次lock
之后并沒有unlok
之前再次lock
之后役衡,會造成永遠的死鎖。
6.NSCondition
- 是對
pthread_mutex默認鎖 和 cond
的封裝
- (void)wait;
- (BOOL)waitUntilDate:(NSDate *)limit;
- (void)signal;
- (void)broadcast;
7.NSConditionLock
-
NSConditionLock
是對NSCondition
的封裝薪棒,多出condition
條件屬性,可以根據(jù)自己的邏輯來設置不同的條件condition
- 一般可以設置線程之間的依賴
// 當滿足condition的時候才加鎖
- (void)lockWhenCondition:(NSInteger)condition;
//嘗試獲取鎖對象手蝎,獲取成功需要配對unlock
- (BOOL)tryLock;
// 嘗試滿足condition加鎖
- (BOOL)tryLockWhenCondition:(NSInteger)condition; //同上
//解鎖榕莺,并且設置lock.condition = condition
- (void)unlockWithCondition:(NSInteger)condition;
8.NSRecursiveLock
遞歸鎖
- 是對
pthread_mutex
遞歸鎖的一個Objective-C
的封裝
// 嘗試加鎖
- (BOOL)tryLock;
// 在這個時間之前加鎖,如果加鎖成功棵介,則返回yes钉鸯,不成功則為false
- (BOOL)lockBeforeDate:(NSDate *)limit;
- (void)lock;
- (void)unlock;
9.@synchronized
遞歸鎖
-
synchronized
是對當前對象進行加鎖,且底層使用的是pthread_mutex
里面的Recursive
模式加鎖 - 底層使用哈希表來儲存
lock
和鎖對象
之間的關聯(lián)邮辽,使用的是鎖對象
當做key
唠雕,lock
當作為值來儲存的哈西表里面。 - 每次進來時會從哈希表取出
lock
進行??
逆巍,結束的時候及塘,會取出lock
進行unlock
.
解釋:
遞歸鎖:表示同意線程可以多次重復加鎖,但是必須加鎖和解鎖為一一對應锐极。不同線程也是不可以多次加鎖
自旋鎖:表示等待加鎖的線程是一直循環(huán)等待笙僚,一直占用cpu資源
互斥鎖:表示等待加鎖的線程是處于休眠狀態(tài),等待鎖放開后灵再,喚起線程
自旋鎖肋层、互斥鎖都是不可以在同一線程里面加鎖的,只有遞歸鎖是可以在同一線程加鎖