ios的11種鎖

一、自旋鎖和互斥鎖區(qū)別

自旋鎖: 忙等待路鹰。即在訪問被鎖資源時(shí)贷洲,調(diào)用者線程不會(huì)休眠,而是不停循環(huán)在那里晋柱,直到被鎖資源釋放
互斥鎖: 會(huì)休眠优构。即在訪問被鎖資源時(shí),調(diào)用者線程會(huì)休眠雁竞,此時(shí)cpu可以調(diào)度其它線程工作钦椭,直到被鎖資源釋放,此時(shí)會(huì)喚醒休眠線程浓领。

二者相同點(diǎn):
都能保證同一時(shí)間只有一個(gè)線程訪問共享資源玉凯。都能保證線程安全。

二联贩、OSSpinLock(自旋鎖)

  • OSSpinLock叫做”自旋鎖”漫仆,等待鎖的線程會(huì)處于忙等(busy-wait)狀態(tài),一直占用著CPU資源

  • 目前已經(jīng)不再安全泪幌,可能會(huì)出現(xiàn)優(yōu)先級(jí)反轉(zhuǎn)問題

    • 如果等待鎖的線程優(yōu)先級(jí)較高盲厌,它會(huì)一直占用著CPU資源署照,優(yōu)先級(jí)低的線程就無法釋放鎖
  • 需要導(dǎo)入頭文件#import <libkern/OSAtomic.h>

    OSSpinLock

    備注:
    一定要對(duì)同一把鎖進(jìn)行加鎖

三、os_unfair_lock(互斥鎖)

  • os_unfair_lock用于取代不安全的OSSpinLock 吗浩,從iOS10開始才支持
  • 從底層調(diào)用看建芙,等待os_unfair_lock鎖的線程會(huì)處于休眠狀態(tài),并非忙等
  • 需要導(dǎo)入頭文件#import <os/lock.h>
os_unfair_lock

四懂扼、pthread_mutex(互斥鎖)

  • 是跨平臺(tái)的(凡是帶有pthread)
  • mutex叫做”互斥鎖”禁荸,等待鎖的線程會(huì)處于休眠狀態(tài)
  • 需要導(dǎo)入頭文件#import <pthread.h>


    pthread_mutex
pthread_mutex

備注:
pthread_mutex可以有3個(gè)狀態(tài),一般常用的是2個(gè)狀態(tài):normal和recursive

  • normal(互斥鎖)
  • recursive(遞歸鎖)

五阀湿、pthread_mutex-遞歸鎖

pthread_mutex-遞歸鎖

六赶熟、pthread_mutex – 條件

pthread_mutex – 條件

七、NSLock(互斥鎖)

  • NSLock是對(duì)mutex普通鎖的封裝


    NSLock方法
NSLock協(xié)議
NSLock初始化

八陷嘴、NSRecursiveLock(遞歸鎖)

  • NSRecursiveLock也是對(duì)mutex遞歸鎖的封裝映砖,API跟NSLock基本一致

九、NSCondition(條件鎖)

  • NSCondition是對(duì)mutex和cond的封裝


    NSCondition

十灾挨、NSConditionLock(條件鎖)

  • NSConditionLock是對(duì)NSCondition的進(jìn)一步封裝邑退,可以設(shè)置具體的條件值


    NSConditionLock

十一、dispatch_semaphore

  • semaphore叫做”信號(hào)量”
  • 信號(hào)量的初始值劳澄,可以用來控制線程并發(fā)訪問的最大數(shù)量
  • 信號(hào)量的初始值為1地技,代表同時(shí)只允許1條線程訪問資源,保證線程同步
dispatch_semaphore

十二浴骂、dispatch_queue

  • 直接使用GCD的串行隊(duì)列乓土,也是可以實(shí)現(xiàn)線程同步的


    dispatch_queue

十三宪潮、@synchronized

  • @synchronized是對(duì)mutex遞歸鎖的封裝
  • 源碼查看:objc4中的objc-sync.mm文件
  • @synchronized(obj)內(nèi)部會(huì)生成obj對(duì)應(yīng)的遞歸鎖溯警,然后進(jìn)行加鎖、解鎖操作


    @synchronized

小結(jié):

  • OSSpinLock效率最高狡相,但是已經(jīng)不再安全梯轻,使用os_unfair_lock(ios10.0以上),最優(yōu)方案是使用dispatch_semaphore
  • 遞歸鎖比非遞歸鎖要耗時(shí)尽棕,但是當(dāng)保護(hù)資源需要遞歸調(diào)用時(shí)喳挑,就要使用遞歸鎖:pthread_mutex-遞歸鎖、NSRecursiveLock滔悉、synchronized
  • NSLock和NSCondition效率可以伊诵,使用也比較簡(jiǎn)單
  • dispatch_semaphore和自旋鎖效率接近,使用簡(jiǎn)單回官,一般推薦使用dispatch_semaphore進(jìn)行資源保護(hù)
  • NSConditionLock是條件鎖曹宴,內(nèi)部有個(gè)condition狀態(tài),滿足這個(gè)condition才會(huì)獲取到鎖歉提,否則會(huì)阻塞等待笛坦。效率比較低效区转,一般不使用。

十四版扩、自旋鎖废离、互斥鎖比較

14.1、什么情況使用自旋鎖比較劃算礁芦?

  • 預(yù)計(jì)線程等待鎖的時(shí)間很短
  • 加鎖的代碼(臨界區(qū))經(jīng)常被調(diào)用蜻韭,但競(jìng)爭(zhēng)情況很少發(fā)生
  • CPU資源不緊張
  • 多核處理器

14.2、什么情況使用互斥鎖比較劃算柿扣?

  • 預(yù)計(jì)線程等待鎖的時(shí)間較長(zhǎng)
  • 單核處理器
  • 臨界區(qū)有IO操作
  • 臨界區(qū)代碼復(fù)雜或者循環(huán)量大
  • 臨界區(qū)競(jìng)爭(zhēng)非常激烈

十五湘捎、atomic誤解

只能保證set和get方法是原子操作,是安全的窄刘。但是窥妇,你使用對(duì)象時(shí),這個(gè)是不受保護(hù)的

十六娩践、高效的讀寫

使用dispatch_barrier_async活翩。

十七、并發(fā)數(shù)組崩潰解決方案

  • GCD的并發(fā)隊(duì)列翻伺,使用dispatch_barrier_async
  • 數(shù)組的讀寫同時(shí)增加互斥鎖(保持最小加鎖原則)

十八材泄、小知識(shí)點(diǎn)

  • GCD并發(fā)隊(duì)列子線程任務(wù)過多(超過64個(gè)),會(huì)導(dǎo)致主線程死鎖吨岭。
  • 子線程不使用自動(dòng)釋放池:不會(huì)導(dǎo)致內(nèi)存泄漏
  • 正確休眠子線程:有事情就工作拉宗,否則休眠,并且隨時(shí)可以退出

十九辣辫、鎖的性能對(duì)比

鎖的性能對(duì)比
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旦事,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子急灭,更是在濱河造成了極大的恐慌姐浮,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葬馋,死亡現(xiàn)場(chǎng)離奇詭異卖鲤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)畴嘶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門蛋逾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窗悯,你說我怎么就攤上這事区匣。” “怎么了蟀瞧?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵沉颂,是天一觀的道長(zhǎng)条摸。 經(jīng)常有香客問我,道長(zhǎng)铸屉,這世上最難降的妖魔是什么钉蒲? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮彻坛,結(jié)果婚禮上顷啼,老公的妹妹穿的比我還像新娘。我一直安慰自己昌屉,他們只是感情好钙蒙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著间驮,像睡著了一般躬厌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上竞帽,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天扛施,我揣著相機(jī)與錄音,去河邊找鬼屹篓。 笑死疙渣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的堆巧。 我是一名探鬼主播妄荔,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼谍肤!你這毒婦竟也來了啦租?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤谣沸,失蹤者是張志新(化名)和其女友劉穎刷钢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乳附,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年伴澄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赋除。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡非凌,死狀恐怖举农,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敞嗡,我是刑警寧澤颁糟,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布航背,位于F島的核電站,受9級(jí)特大地震影響棱貌,放射性物質(zhì)發(fā)生泄漏玖媚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一婚脱、第九天 我趴在偏房一處隱蔽的房頂上張望今魔。 院中可真熱鬧,春花似錦障贸、人聲如沸错森。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涩维。三九已至,卻和暖如春袁波,著一層夾襖步出監(jiān)牢的瞬間激挪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工锋叨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垄分,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓娃磺,卻偏偏與公主長(zhǎng)得像薄湿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子偷卧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 鎖是一種同步機(jī)制豺瘤,用于多線程環(huán)境中對(duì)資源訪問的限制iOS中常見鎖的性能對(duì)比圖(摘自:ibireme): iOS鎖的...
    LiLS閱讀 1,507評(píng)論 0 6
  • 1. 什么情況下會(huì)有線程隱患? 我們?cè)谑褂枚嗑€程技術(shù)帶來的便利的同時(shí)听诸,也需要考慮下多線程所帶來的隱患坐求。比如,我們可...
    沉江小魚閱讀 806評(píng)論 0 11
  • 目錄:1.為什么要線程安全2.多線程安全隱患分析3.多線程安全隱患的解決方案4.鎖的分類-13種鎖4.1.1OSS...
    二斤寂寞閱讀 1,171評(píng)論 0 3
  • 轉(zhuǎn)自(https://bestswifter.com/ios-lock/#) 深入理解 iOS 開發(fā)中的鎖 摘要 ...
    犯色戒的和尚閱讀 315評(píng)論 0 1
  • 如何理解自立渊鞋、自強(qiáng)、自尊、自愛锡宋、自重儡湾。 ①自立:可獨(dú)立不依賴,不靠別人可自我完成一件事执俩,也指有主見徐钠,可拿主意,不用...
    Z老三閱讀 23,249評(píng)論 0 2