iOS 開發(fā)中的八種鎖(Lock)

鎖 是什么意思放前?

我們在使用多線程的時候多個線程可能會訪問同一塊資源,這樣就很容易引發(fā)數(shù)據(jù)錯亂和數(shù)據(jù)安全等問題,這時候就需要我們保證每次只有一個線程訪問這一塊資源彼水,?應(yīng)運而生。

OSSpinLock2

在?OSSpinLock1?圖中可以發(fā)現(xiàn):當我們鎖住線程1時极舔,在同時鎖住線程2的情況下凤覆,線程2會一直等待(自旋鎖不會讓等待的進入睡眠狀態(tài)),直到線程1的任務(wù)執(zhí)行完且解鎖完畢拆魏,線程2會立即執(zhí)行盯桦;而在?OSSpinLock2?圖中,因為我們注釋掉了線程1中的解鎖代碼渤刃,會繞過線程1拥峦,直到調(diào)用了線程2的解鎖方法才會繼續(xù)執(zhí)行線程1中的任務(wù),正常情況下卖子,lock和unlock最好成對出現(xiàn)略号。

這里順便提一下trylock和lock使用場景:

當前線程鎖失敗,也可以繼續(xù)其它任務(wù)洋闽,用 trylock 合適

當前線程只有鎖成功后璃哟,才會做一些有意義的工作,那就 lock喊递,沒必要輪詢 trylock

dispatch_semaphore 信號量

dispatch_semaphore_create(1):?傳入值必須?>=0, 若傳入為?0?則阻塞線程并等待timeout,時間到后會執(zhí)行其后的語句

dispatch_semaphore_wait(signal, overTime):可以理解為?lock,會使得?signal?值?-1

dispatch_semaphore_signal(signal):可以理解為?unlock,會使得?signal?值?+1


停車場剩余4個車位随闪,那么即使同時來了四輛車也能停的下。如果此時來了五輛車骚勘,那么就有一輛需要等待铐伴。

信號量的值(signal)就相當于剩余車位的數(shù)目撮奏,dispatch_semaphore_wait?函數(shù)就相當于來了一輛車,dispatch_semaphore_signal?就相當于走了一輛車当宴。停車位的剩余數(shù)目在初始化的時候就已經(jīng)指明了(dispatch_semaphore_create(long value))畜吊,調(diào)用一次 dispatch_semaphore_signal,剩余的車位就增加一個户矢;調(diào)用一次dispatch_semaphore_wait 剩余車位就減少一個玲献;當剩余車位為 0 時,再來車(即調(diào)用 dispatch_semaphore_wait)就只能等待梯浪。有可能同時有幾輛車等待一個停車位捌年。有些車主沒有耐心,給自己設(shè)定了一段等待時間挂洛,這段時間內(nèi)等不到停車位就走了礼预,如果等到了就開進去停車。而有些車主就像把車停在這虏劲,所以就一直等下去托酸。

pthread_mutex 互斥鎖

pthread_mutex 中也有個pthread_mutex_trylock(&pLock),和上面提到的?OSSpinLockTry(&oslock)區(qū)別在于柒巫,前者可以加鎖時返回的是?0励堡,否則返回一個錯誤提示碼;后者返回的?YES和NO

pthread_mutex(recursive) 遞歸鎖

經(jīng)過上面幾種例子堡掏,我們可以發(fā)現(xiàn):加鎖后只能有一個線程訪問該對象应结,后面的線程需要排隊,并且 lock 和 unlock 是對應(yīng)出現(xiàn)的布疼,同一線程多次 lock 是不允許的摊趾,而遞歸鎖允許同一個線程在未釋放其擁有的鎖時反復對該鎖進行加鎖操作。

NSLock 普通鎖

lock游两、unlock:不多做解釋砾层,和上面一樣

trylock:能加鎖返回 YES 并執(zhí)行加鎖操作,相當于 lock贱案,反之返回 NO

lockBeforeDate:這個方法表示會在傳入的時間內(nèi)嘗試加鎖肛炮,若能加鎖則執(zhí)行加鎖操作并返回 YES,反之返回 NO

NSCondition

wait:進入等待狀態(tài)

waitUntilDate::讓一個線程等待一定的時間

signal:喚醒一個等待的線程

broadcast:喚醒所有等待的線程

NSRecursiveLock 遞歸鎖

上面已經(jīng)大概介紹過了:

遞歸鎖可以被同一線程多次請求宝踪,而不會引起死鎖侨糟。這主要是用在循環(huán)或遞歸操作中。

@synchronized 條件鎖

@synchronized 相信大家應(yīng)該都熟悉瘩燥,它的用法應(yīng)該算這些鎖中最簡單的:

NSConditionLock 條件鎖

NSConditionLock

相比于 NSLock 多了個?condition?參數(shù)秕重,我們可以理解為一個條件標示

從上面的結(jié)果我們可以發(fā)現(xiàn)厉膀,NSConditionLock 還可以實現(xiàn)任務(wù)之間的依賴溶耘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末二拐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子凳兵,更是在濱河造成了極大的恐慌百新,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庐扫,死亡現(xiàn)場離奇詭異饭望,居然都是意外死亡,警方通過查閱死者的電腦和手機形庭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門铅辞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碘勉,你說我怎么就攤上這事巷挥∽眩” “怎么了验靡?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雏节。 經(jīng)常有香客問我胜嗓,道長,這世上最難降的妖魔是什么钩乍? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任辞州,我火速辦了婚禮,結(jié)果婚禮上寥粹,老公的妹妹穿的比我還像新娘变过。我一直安慰自己,他們只是感情好涝涤,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布媚狰。 她就那樣靜靜地躺著,像睡著了一般阔拳。 火紅的嫁衣襯著肌膚如雪崭孤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天糊肠,我揣著相機與錄音辨宠,去河邊找鬼。 笑死货裹,一個胖子當著我的面吹牛嗤形,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弧圆,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赋兵,長吁一口氣:“原來是場噩夢啊……” “哼还最!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起毡惜,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤拓轻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后经伙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扶叉,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年帕膜,在試婚紗的時候發(fā)現(xiàn)自己被綠了枣氧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡垮刹,死狀恐怖达吞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荒典,我是刑警寧澤酪劫,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站寺董,受9級特大地震影響覆糟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜遮咖,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一滩字、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧御吞,春花似錦麦箍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至背率,卻和暖如春话瞧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寝姿。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工交排, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饵筑。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓埃篓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親根资。 傳聞我的和親對象是個殘疾皇子架专,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

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

  • 這兩天翻看 ibireme 大神 《不再安全的 OSSpinLock》 這篇文章同窘,看到文中分析各種鎖之前的性能的圖...
    ifelseboyxx閱讀 34,314評論 21 200
  • 鎖是一種同步機制,用于多線程環(huán)境中對資源訪問的限制iOS中常見鎖的性能對比圖(摘自:ibireme): iOS鎖的...
    LiLS閱讀 1,516評論 0 6
  • 為什么要有鎖部脚? 在使用多線程的時候多個線程可能會訪問同一塊資源想邦,這樣就很容易引發(fā)數(shù)據(jù)錯亂和數(shù)據(jù)安全等問題,這時候就...
    153037c65b0c閱讀 550評論 0 1
  • 轉(zhuǎn)載自:http://www.reibang.com/p/938d68ed832c# 一委刘、前言 前段時間看了幾個...
    cafei閱讀 4,540評論 1 12
  • OK丧没,又到了漫談時間,這一篇的閑聊是麻糬(muah ji)與橘子锡移。麻糬是臺灣特產(chǎn)呕童,具體是什么東西我也沒嘗過。不過近...
    化濁閱讀 301評論 1 2