常用的鎖

iOS中使用的鎖主要包括以下幾種:

1. ?@synchronized:

這是一個Objective-C提供的同步指令夕凝,用于保護臨界區(qū)代碼厘肮。

它通過給定的對象作為鎖的唯一標識类茂,確保同一標識的線程互斥訪問臨界區(qū)。

@synchronized指令內(nèi)部使用一個哈希表來存儲和檢索互斥鎖啤月,當線程進入臨界區(qū)時,會先檢查該鎖是否被占用轻抱。

2. ?NSLock:

NSLock是一個簡單的互斥鎖類。

它提供了基本的加鎖和解鎖操作,用于同步訪問共享資源容燕。

NSLock是非遞歸的梁呈,意味著同一線程在已經(jīng)持有鎖的情況下再次調(diào)用lock方法會導(dǎo)致死鎖。

3. ?NSRecursiveLock:

這是一個遞歸鎖蘸秘,允許同一線程多次獲取同一把鎖而不會導(dǎo)致死鎖官卡。

當一個線程已經(jīng)持有鎖時,它可以再次調(diào)用lock方法而不會阻塞醋虏。

當該線程調(diào)用unlock方法時寻咒,鎖的計數(shù)會遞減,直到計數(shù)為0時颈嚼,其他線程才能獲取該鎖仔涩。

4. ?NSCondition #I NSConditionLock:

這兩個類提供了條件變量和條件鎖的功能。

NSCondition允許線程等待某個條件成立粘舟,或者喚醒等待該條件的線程。

NSConditionLock允許更復(fù)雜的鎖定策略佩研,可以基于特定的條件來鎖定和解鎖柑肴。

5. 0SSpinLock(已奔用):

? OSSpinLock是一個自旋鎖,用于多線程同步旬薯。

? 當線程嘗試獲取鎖時晰骑,如果鎖不可用,線程會忙等待(即不斷循環(huán)檢查鎖是否可用),而不是進入休眠狀態(tài)硕舆。

? 由于自旋鎖在等待過程中會消耗CPU資源秽荞,因此適用于鎖競爭不激烈且等待時間短的場

? 注意:OSSpinLock在I0S 10及更高版本已被棄用,因為它在某些情況下可能導(dǎo)致優(yōu)先級反轉(zhuǎn)問題抚官。

6. ?dispatch_semaphore:

?這是一個信號量扬跋,用于控制對共享資源的訪問。

?信號量有一個計數(shù)值凌节,當線程需要訪問共享資源時钦听,會嘗試減少信號量的計數(shù)值;如果計數(shù)值為0倍奢,則線程會阻塞等待朴上。

? 當其他線程釋放共享資源并增加信號量的計數(shù)值時,等待的線程會被喚醒并繼續(xù)執(zhí)行卒煞。

7. os_unfair_lock:

?這是一個不公平鎖痪宰,提供了高性能的同步機制。

? 與傳統(tǒng)的互斥鎖相比畔裕,它可能允許某些線程連續(xù)獲得鎖衣撬,而其他線程則可能長時間得不到鎖。

? 因此柴钻,它適用于對性能敏感且可以接受一定程度不公乎性的場景淮韭。

os_unfair_lock

os_unfair_lock是iOS 10.0以后出現(xiàn)的一種鎖,旨在替代OSSpinLock贴届。

其核心原理:

在嘗試獲取已加鎖的線程時靠粪,不會進行忙等待(busy-waiting),而是使線程進入睡眠狀態(tài)毫蚓。這種設(shè)計可以避免優(yōu)先級反轉(zhuǎn)的問題占键,因為在高優(yōu)先級的線程等待低優(yōu)先級線程釋放鎖時,低優(yōu)先級線程可能會一直持有鎖元潘,導(dǎo)致高優(yōu)先級線程無法獲取鎖畔乙,從而影響系統(tǒng)性能。

os_unfair_lock的初始化:

通過os_unfair_lock_init函數(shù)完成翩概,

嘗試加鎖通過:

os_unfair_lock_try函數(shù)牲距,

真正加鎖通過:

os_unfair_lock_lock函數(shù),

解鎖則通過:

os_unfair_lock_unlock函數(shù)

os_unfair_lock局限性:

例如可能導(dǎo)致饑餓(starvation)問題钥庇。具體來說牍鞠,當一個線程釋放鎖后,等待該鎖的線程可能沒有機會立即獲取到鎖评姨,因為其他線程可能立即再次獲取該鎖难述。這可能導(dǎo)致某些線程長時間無法獲取到鎖,從而影響系統(tǒng)的公平性和性能。

總的來說:

os_unfair_lock是一種底層鎖機制胁后,其設(shè)計旨在提高性能并避免優(yōu)先級反轉(zhuǎn)問題店读,但也需要注意其可能帶來的饑餓問題。在實際應(yīng)用中攀芯,應(yīng)根據(jù)具體需求選擇合適的鎖機制屯断。

最后,總之:

這些鎖在iOS鄉(xiāng)線程編程中各有其用途和適用場景敲才,開發(fā)者應(yīng)根據(jù)具體需求選擇合適的鎖來確保線程安全和資源同步裹纳。同時,也需要注意避免死鎖和競態(tài)條件等潛在問題紧武。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剃氧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子阻星,更是在濱河造成了極大的恐慌朋鞍,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妥箕,死亡現(xiàn)場離奇詭異滥酥,居然都是意外死亡,警方通過查閱死者的電腦和手機畦幢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門坎吻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宇葱,你說我怎么就攤上這事瘦真。” “怎么了黍瞧?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵诸尽,是天一觀的道長。 經(jīng)常有香客問我印颤,道長您机,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任年局,我火速辦了婚禮际看,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘矢否。我一直安慰自己仿村,他們只是感情好,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布兴喂。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪衣迷。 梳的紋絲不亂的頭發(fā)上畏鼓,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音壶谒,去河邊找鬼云矫。 笑死,一個胖子當著我的面吹牛汗菜,可吹牛的內(nèi)容都是我干的让禀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼陨界,長吁一口氣:“原來是場噩夢啊……” “哼巡揍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起菌瘪,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腮敌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后俏扩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糜工,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年录淡,在試婚紗的時候發(fā)現(xiàn)自己被綠了捌木。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嫉戚,死狀恐怖刨裆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情彼水,我是刑警寧澤崔拥,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站凤覆,受9級特大地震影響链瓦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盯桦,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一慈俯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拥峦,春花似錦贴膘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洋闽。三九已至,卻和暖如春突梦,著一層夾襖步出監(jiān)牢的瞬間诫舅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工宫患, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刊懈,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓娃闲,卻偏偏與公主長得像虚汛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子皇帮,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

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