iOS底層探索之多線程(十三)—鎖的種類你知多少?

你用過哪些鎖?對于鎖的種類你了解多少幻件?鎖的原理知道否拨黔?從本篇博客開始將對的相關內容進行分析!

關于鎖你知多少绰沥?.png

iOS底層探索之多線程(一)—進程和線程

iOS底層探索之多線程(二)—線程和鎖

iOS底層探索之多線程(三)—初識GCD

iOS底層探索之多線程(四)—GCD的隊列

iOS底層探索之多線程(五)—GCD不同隊列源碼分析

iOS底層探索之多線程(六)—GCD源碼分析(sync 同步函數篱蝇、async 異步函數)

iOS底層探索之多線程(七)—GCD源碼分析(死鎖的原因)

iOS底層探索之多線程(八)—GCD源碼分析(函數的同步性、異步性徽曲、單例)

iOS底層探索之多線程(九)—GCD源碼分析(柵欄函數)

iOS底層探索之多線程(十)—GCD源碼分析( 信號量)

iOS底層探索之多線程(十一)—GCD源碼分析(調度組)

iOS底層探索之多線程(十二)—GCD源碼分析(事件源)

1.鎖的介紹

在 iOS 中有以下九種鎖

  1. OSSpinLock:(自旋鎖)
  2. dispatch_semaphore_t:(信號量/互斥鎖)
  3. os_unfair_lock_lock:(自旋鎖)
  4. pthread_mutex_t:(互斥遞歸鎖)
  5. NSLock:(互斥鎖)
  6. NSCondition:(條件鎖)
  7. NSRecursiveLock:(遞歸鎖)
  8. NSConditionLock:(條件鎖)
  9. @synchronized:(內部是互斥鎖)

通過對以上的進行 加鎖/解鎖 10萬次的測試表現零截,結果如下

  1. iPhone12 模擬器


    iPhone12 模擬器
  • 性能測試統計圖表如下


    iPhone12 模擬器
  1. iPhoneXR 模擬器


    iPhoneXR 模擬器
  2. iPhoneXR 真機

    iPhoneXR 真機

    通過以上測試,的性能最好的前三位是:OSSpinLock(自旋鎖) -> dispatch_semaphone(信號量) -> pthread_mutex(互斥鎖) 秃臣,最差的是synchronized(互斥鎖)涧衙,但也是我們最常用的鎖之一。

2. 鎖的分類

鎖分為兩大類奥此,自旋鎖互斥鎖弧哎。

自旋鎖

是一種用于保護多線程共享資源的鎖,與一般互斥鎖mutex)不同之處在于當自旋鎖嘗試獲取鎖時以忙等待busy waiting)的形式不斷地循環(huán)檢查鎖是否可用稚虎。當上一個線程的任務沒有執(zhí)行完畢的時候(被鎖壮纺邸),那么下一個線程會一直等待(不會睡眠)蠢终,當上一個線程的任務執(zhí)行完畢序攘,下一個線程會立即執(zhí)行茴她。
在多CPU的環(huán)境中,對持有鎖較短的程序來說程奠,使用自旋鎖代替一般的互斥鎖往往能夠提高程序的性能丈牢。

自旋鎖:OSSpinLock(自旋鎖)、讀寫鎖

  1. 自旋鎖
  • OSSpinLock
  • os_unfair_lock_lock
  1. 互斥鎖
  • pthread_mutex_t
  • NSLock
  • NSCondition
  • NSRecursiveLock
  • NSConditionLock
  • dispatch_semaphore_t
  • @synchronized (內部是)

互斥鎖

當上一個線程的任務沒有執(zhí)行完畢的時候(被鎖酌稳尽)赡麦,那么下一個線程會進入睡眠狀態(tài)等待任務執(zhí)行完畢,當上一個線程的任務執(zhí)行完畢帕识,下一個線程會自動喚醒然后執(zhí)行任務泛粹,該任務也不會立刻執(zhí)行,而是成為可執(zhí)行狀態(tài)(就緒)肮疗。

互斥鎖(mutex)晶姊,?于保證在任何時刻,都只能有?個線程訪問該對象伪货。
mutex函數
Posix Thread中定義有?套專??于線程同步的mutex函數们衙。mutex?于保證在任何時刻,都只能有?個線程訪問該對象碱呼。當獲取鎖操作失敗時蒙挑,線程會進?睡眠,等待鎖釋放時被喚醒愚臀。NSLock忆蚀、NSCondtion、NSRecursiveLock底層都是對pthread的封裝姑裂。

互斥和同步的理解

互斥:兩條線程處理馋袜,同一時間只有一個線程可以運行;
同步:除了有互斥的意思外舶斧,同時還有一定的順序要求欣鳖,即按照一定的順序執(zhí)行。

遞歸鎖

就是同?個線程可以加鎖N次?不會引發(fā)死鎖NSRecursiveLock茴厉、@synchronized泽台、pthread_mutex(recursive)

互斥鎖:pthread_mutex(互斥鎖)、@synchronized(互斥鎖)矾缓、NSLock(互斥鎖)怀酷、NSConditionLock(條件鎖)NSCondition(條件鎖)而账、NSRecursiveLock(遞歸鎖)dispatch_semaphore_t(信號量)

自旋鎖和互斥鎖的特點

自旋鎖忙等因篇,所謂忙等泞辐,即在訪問被鎖資源時笔横,調用者線程不會休眠,而是一直地不停循環(huán)在那里咐吼,直到被鎖資源釋放鎖吹缔,就和上 WC一樣,里面有人了锯茄,門鎖住了厢塘,你一直在門外等著,一直敲門詢問肌幽,好了嗎晚碾?好了沒有啊喂急?廊移。

互斥鎖休眠,所謂休眠狡孔,即在訪問被鎖資源時懂诗,調用者線程會休眠殃恒,此時cpu可以調度其他線程工作,直到被鎖資源釋放鎖,此時會喚醒休眠線程贮竟。就是你知道廁所有人了,你先憋著,不會一直敲門詢問偿短,等里面的人好了降传,你在就去。

自旋鎖優(yōu)缺點

優(yōu)點 在于,因為自旋鎖不會引起調用者睡眠翼悴,所以不會進行線程調度误堡,CPU時間片輪轉等耗時操作,所有如果能在很短的時間內獲得鎖肩狂,自旋鎖的效率遠高于互斥鎖
缺點 在于,自旋鎖一直占用CPU态蒂,他在未獲得鎖的情況下瘩蚪,一直運行自旋闻察,所以占用著CPU,如果不能在很短的時間內獲得鎖,這無疑會使CPU效率降低。自旋鎖不能實現遞歸調用奖年。

3. 鎖的作用

在編程中水评,特別是多線程開發(fā)者中媚送,來保證共享數據操作的完整性中燥。假如有 ABC三條甚至更多的線程褪那,同時去訪問資源,那么讀的話是沒有問題式塌,要是寫的話博敬,就可能出問題伦意,同時修改了某一個數據已骇,這樣就破壞的數據的完整性了。

加鎖的話鲤竹,就是同一個時間浪读,只能有一個個線程訪問,其他的靠邊等待辛藻,可以給每個對象都對應于一個可稱為"互斥鎖" 的標記碘橘,這個標記用來保證在任一時刻,只能有一個線程訪問該對象岩榆。

下篇博客將對鎖進行舉例并對底層進行分析错负,敬請期待!

更多內容持續(xù)更新

?? 喜歡就點個贊吧????

?? 覺得有收獲的勇边,可以來一波犹撒,收藏+關注,評論 + 轉發(fā)粒褒,以免你下次找不到我????

??歡迎大家留言交流识颊,批評指正,互相學習??,提升自我??

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市完残,隨后出現的幾起案子,更是在濱河造成了極大的恐慌刃跛,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苛萎,死亡現場離奇詭異桨昙,居然都是意外死亡检号,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門蛙酪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來齐苛,“玉大人,你說我怎么就攤上這事桂塞“挤洌” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵阁危,是天一觀的道長炊甲。 經常有香客問我,道長欲芹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任吟吝,我火速辦了婚禮菱父,結果婚禮上,老公的妹妹穿的比我還像新娘剑逃。我一直安慰自己浙宜,他們只是感情好,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布蛹磺。 她就那樣靜靜地躺著粟瞬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萤捆。 梳的紋絲不亂的頭發(fā)上裙品,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機與錄音俗或,去河邊找鬼市怎。 笑死,一個胖子當著我的面吹牛辛慰,可吹牛的內容都是我干的区匠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼帅腌,長吁一口氣:“原來是場噩夢啊……” “哼驰弄!你這毒婦竟也來了?” 一聲冷哼從身側響起速客,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤戚篙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后溺职,有當地人在樹林里發(fā)現了一具尸體已球,經...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡臣镣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了智亮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忆某。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖阔蛉,靈堂內的尸體忽然破棺而出弃舒,到底是詐尸還是另有隱情,我是刑警寧澤状原,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布聋呢,位于F島的核電站,受9級特大地震影響颠区,放射性物質發(fā)生泄漏削锰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一毕莱、第九天 我趴在偏房一處隱蔽的房頂上張望器贩。 院中可真熱鬧,春花似錦朋截、人聲如沸蛹稍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽唆姐。三九已至,卻和暖如春廓八,著一層夾襖步出監(jiān)牢的瞬間奉芦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工剧蹂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仗阅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓国夜,卻偏偏與公主長得像减噪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子车吹,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內容