Objective-C 常用鎖的介紹

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_semaphorevalue,來設置最大的并發(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),等待鎖放開后灵再,喚起線程
自旋鎖肋层、互斥鎖都是不可以在同一線程里面加鎖的,只有遞歸鎖是可以在同一線程加鎖

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翎迁,一起剝皮案震驚了整個濱河市栋猖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌汪榔,老刑警劉巖蒲拉,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異痴腌,居然都是意外死亡雌团,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門士聪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锦援,“玉大人,你說我怎么就攤上這事剥悟×樗拢” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵区岗,是天一觀的道長略板。 經(jīng)常有香客問我,道長慈缔,這世上最難降的妖魔是什么蚯根? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上颅拦,老公的妹妹穿的比我還像新娘蒂誉。我一直安慰自己,他們只是感情好距帅,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布右锨。 她就那樣靜靜地躺著,像睡著了一般碌秸。 火紅的嫁衣襯著肌膚如雪绍移。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天讥电,我揣著相機與錄音蹂窖,去河邊找鬼。 笑死恩敌,一個胖子當著我的面吹牛瞬测,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纠炮,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼月趟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恢口?” 一聲冷哼從身側(cè)響起孝宗,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耕肩,沒想到半個月后因妇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡猿诸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年婚被,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片两芳。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡摔寨,死狀恐怖去枷,靈堂內(nèi)的尸體忽然破棺而出怖辆,到底是詐尸還是另有隱情,我是刑警寧澤删顶,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布竖螃,位于F島的核電站,受9級特大地震影響逗余,放射性物質(zhì)發(fā)生泄漏特咆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腻格。 院中可真熱鬧画拾,春花似錦、人聲如沸菜职。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酬核。三九已至蜜另,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嫡意,已是汗流浹背举瑰。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蔬螟,地道東北人此迅。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像促煮,于是被迫代替她去往敵國和親邮屁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 鎖是一種同步機制菠齿,用于多線程環(huán)境中對資源訪問的限制iOS中常見鎖的性能對比圖(摘自:ibireme): iOS鎖的...
    LiLS閱讀 1,518評論 0 6
  • 轉(zhuǎn)自(https://bestswifter.com/ios-lock/#) 深入理解 iOS 開發(fā)中的鎖 摘要 ...
    犯色戒的和尚閱讀 320評論 0 1
  • Q:為什么出現(xiàn)多線程佑吝? A:為了實現(xiàn)同時干多件事的需求(并發(fā)),同時進行著下載和頁面UI刷新绳匀。對于處理器芋忿,為每個線...
    幸福相依閱讀 1,582評論 0 2
  • 1. 什么情況下會有線程隱患? 我們在使用多線程技術帶來的便利的同時疾棵,也需要考慮下多線程所帶來的隱患戈钢。比如焦辅,我們可...
    沉江小魚閱讀 817評論 0 11
  • 重溫電視劇《西游記》违寿,倏然間看出了年少時看不出的感覺明吩。 齊天大圣大鬧天宮后役电,玉帝派人請來了如來佛祖苗傅。 佛祖出現(xiàn)后瞧柔,...
    枕藏寫影視閱讀 289評論 1 1