iOS中的鎖筆記

本文只是我對(duì)iOS中鎖的學(xué)習(xí)筆記,沒有太深入的研究講解磺浙。先來一張ios中常用鎖的性能對(duì)照?qǐng)D


截屏2020-11-25 下午5.07.12.png

鎖的分類

自旋鎖:在未獲取到鎖的情況下稻轨,線程會(huì)反復(fù)檢查鎖變量是否可用缚去,處于一直忙等狀態(tài),所以不會(huì)進(jìn)行上下文切換樟结,適用于阻塞很短時(shí)間的場(chǎng)景锥涕,常見的鎖有OSSpinLock,另外atomic修飾符內(nèi)部也是使用的自旋鎖狭吼。

互斥鎖:是一種用于多線程編程中层坠,防止兩條線程同時(shí)對(duì)同一公共資源(比 如全局變量)進(jìn)行讀寫的機(jī)制。它可以將代碼切片成一個(gè)一個(gè)的臨界區(qū)以達(dá)到鎖的目的刁笙。拿不到鎖的線程會(huì)進(jìn)入睡眠狀態(tài)破花,等待其他線程釋放鎖后將其喚醒谦趣。NSLock、pthread_mutex座每、@synchronized都屬于互斥鎖前鹅。

OSSpinLock(自旋鎖)

由于多線程優(yōu)先級(jí)反轉(zhuǎn)問題,可能導(dǎo)致優(yōu)先級(jí)高的線程一直處于忙等狀態(tài)峭梳,而優(yōu)化級(jí)低的線程又拿不到鎖舰绘,所以ios10開始已被os_unfair_lock取代。

dispatch_semaphore

一種比較高級(jí)的線程間同步機(jī)制葱椭,互斥鎖可以說是semaphore在僅取值0/1時(shí)的特例捂寿。

pthread_mutex、NSLock孵运、NSRecursiveLock

NSLock和NSRecursiveLock都是基于pthread_mutex互斥鎖實(shí)現(xiàn)秦陋,但NSRecursiveLock支持遞歸調(diào)用。

NSCondition治笨、NSConditionLock

其底層是使用的互斥鎖驳概,但在此基礎(chǔ)上增加了線程間通訊的能力,通過相應(yīng)的api可以控制線程的執(zhí)行流程旷赖。

synchronized分析

被@synchronized包裹的代碼塊會(huì)被編譯器轉(zhuǎn)換成objc_sync_enter和objc_sync_exit顺又,并且在加解鎖時(shí)是操作的SyncData這個(gè)對(duì)象

typedef struct alignas(CacheLineSize) SyncData {
    struct SyncData* nextData;
    DisguisedPtr<objc_object> object;
    int32_t threadCount;  // number of THREADS using this block
    recursive_mutex_t mutex;
} SyncData;

SyncData存儲(chǔ)在線程緩存中,是一個(gè)鏈表等孵,主要用于針對(duì)不同對(duì)象加鎖的情況稚照。另外其中threadCount是用于多線程的場(chǎng)景,如果多個(gè)線程對(duì)同一個(gè)對(duì)象加鎖流济,只會(huì)增加threadCount的值锐锣。如果是同一個(gè)線程對(duì)同一對(duì)象多次加鎖,例如嵌套的情況绳瘟,那么會(huì)操作線程緩存中的lockCount變量雕憔。

推薦學(xué)習(xí):
iOS-底層原理 29:鎖的原理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市糖声,隨后出現(xiàn)的幾起案子斤彼,更是在濱河造成了極大的恐慌,老刑警劉巖蘸泻,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琉苇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡悦施,警方通過查閱死者的電腦和手機(jī)并扇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抡诞,“玉大人穷蛹,你說我怎么就攤上這事土陪。” “怎么了肴熏?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵鬼雀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我蛙吏,道長(zhǎng)源哩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任鸦做,我火速辦了婚禮励烦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘馁龟。我一直安慰自己崩侠,他們只是感情好漆魔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布坷檩。 她就那樣靜靜地躺著,像睡著了一般改抡。 火紅的嫁衣襯著肌膚如雪矢炼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天阿纤,我揣著相機(jī)與錄音句灌,去河邊找鬼。 笑死欠拾,一個(gè)胖子當(dāng)著我的面吹牛胰锌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播藐窄,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼资昧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了荆忍?” 一聲冷哼從身側(cè)響起格带,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刹枉,沒想到半個(gè)月后叽唱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡微宝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年棺亭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟋软。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡镶摘,死狀恐怖专甩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钉稍,我是刑警寧澤涤躲,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站贡未,受9級(jí)特大地震影響种樱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜俊卤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一嫩挤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧消恍,春花似錦岂昭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至佣赖,卻和暖如春恰矩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背憎蛤。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工外傅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俩檬。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓萎胰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親棚辽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子技竟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • 1. 為什么多線程需要鎖? 首先在多線程處理的時(shí)候我們經(jīng)常會(huì)需要保證同步晚胡,這是為啥呢灵奖,看一下下面這個(gè)例子: 這種時(shí)...
    木小易Ying閱讀 1,045評(píng)論 0 8
  • 鎖的種類 借用網(wǎng)上的一張有關(guān)鎖性能的對(duì)比圖,如下所示: 從上圖中我們可以看出來估盘,鎖大概可以分為以下幾種: 1.:在...
    含笑州閱讀 1,005評(píng)論 0 0
  • 歡迎閱讀iOS探索系列(按序閱讀食用效果更加)iOS探索 alloc流程iOS探索 內(nèi)存對(duì)齊&malloc源碼iO...
    呂子喬_eabd閱讀 1,129評(píng)論 0 2
  • iOS 底層原理 文章匯總[http://www.reibang.com/p/412b20d9a0f6] 本文主...
    Style_月月閱讀 4,372評(píng)論 9 16
  • 寫在前面 多線程在日常開發(fā)中能起到性能優(yōu)化的作用瓷患,但是一旦沒用好就會(huì)造成線程不安全,本文就來講講如何保證線程安全 ...
    M_慕宸閱讀 532評(píng)論 0 5