iOS多線程同步技術(shù)之常用鎖的使用介紹

前言:在出現(xiàn)多線程競爭數(shù)據(jù)的時候往往離不開鎖,那么在這里給大家介紹下我們多線程同步技術(shù)的常用鎖?有下面這些

常用鎖如下:

?OSSpinLock

?os_unfair_lock

?pthread_mutex

?dispatch_semaphore

?dispatch_queue(DISPATCH_QUEUE_SERIAL)

?NSLock

?NSRecursiveLock

?NSCondition

?NSConditionLock

?@synchronized

1巩剖、OSSpinLock?

?OSSpinLock叫做”自旋鎖”样漆,等待鎖的線程會處于忙等(busy-wait)狀態(tài)焦蘑,一直占用著CPU資源。

?目前已經(jīng)不再安全芝此,可能會出現(xiàn)優(yōu)先級反轉(zhuǎn)問題靠胜,如果等待鎖的線程優(yōu)先級較高,它會一直占用著CPU資源饮醇,優(yōu)先級低的線程就無法釋放鎖它抱。這個鎖在ios10之后廢棄了,被os_unfair_lock替代朴艰。需要導(dǎo)入頭文件#import?

OSSpinLock代碼實(shí)現(xiàn):


2观蓄、os_unfair_lock

?os_unfair_lock用于取代不安全的OSSpinLock?,從iOS10開始才支持

?從底層調(diào)用看祠墅,等待os_unfair_lock鎖的線程會處于休眠狀態(tài)侮穿,并非忙等

?需要導(dǎo)入頭文件#import?

?用來取代之前的SpinLock,ios10之后才有的

代碼實(shí)現(xiàn)如下:


3毁嗦、?pthread_mutex

?互斥鎖亲茅,等待鎖的線程會處于休眠狀態(tài)。

?需要導(dǎo)入頭文件#import?

跨平臺的鎖狗准,在linux等其他平臺底層都通用

?PTHREAD_MUTEX_RECURSIVE遞歸鎖允許同一線程對鎖從復(fù)加鎖克锣,不是同一線程不允許。

?PTHREAD_MUTEX_NORMAL普通鎖:不允許線程從復(fù)加鎖腔长,要加鎖需要等鎖解鎖后才能再加娶耍。

(1)pthread_mutex?–?條件


4、NSLock饼酿、NSRecursiveLock

1)、NSLock是對mutex普通鎖的封裝,

?//創(chuàng)建鎖代碼

NSLock* lock = [[NSLock alloc]init];

2)胚膊、NSRecursiveLock也是對mutex遞歸鎖的封裝故俐,API跟NSLock基本一致;


5、 NSCondition

?NSCondition是對mutex和cond的封裝

6紊婉、NSConditionLock


?NSConditionLock是對NSCondition的進(jìn)一步封裝药版,可以設(shè)置具體的條件值

7、 dispatch_semaphore信號量

?信號量

?信號量的初始值喻犁,可以用來控制線程并發(fā)訪問的最大數(shù)量

?信號量的初始值為1槽片,代表同時只允許1條線程訪問資源,保證線程同步


?8肢础、 dispatch_queue實(shí)現(xiàn)線程同步

?直接使用GCD的串行隊(duì)列可以實(shí)現(xiàn)線程同步的

dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_SERIAL);

? ? dispatch_sync(queue, ^{

? ? ? ? //同步實(shí)現(xiàn)的邏輯任務(wù)

? ? });

9还栓、?@synchronized

?@synchronized是對mutex遞歸鎖的封裝

?源碼查看:objc4中的objc-sync.mm文件

?@synchronized(obj)內(nèi)部會生成obj對應(yīng)的遞歸鎖,然后進(jìn)行加鎖传轰、解鎖操作剩盒。相當(dāng)于obj作為key,生成一個遞歸鎖value慨蛙。存在一個哈希表中辽聊。

實(shí)現(xiàn)代碼:

@synchronized(obj對象){

? ? ? ? //任務(wù)...

? ? }

? ? @synchronized(self){

? ? ? ? //任務(wù)...

? ? }

10纪挎、iOS線程同步方案性能比較

上面介紹了常用鎖的使用,那么性能上面比較跟匆,我們平時該怎么選擇使用呢异袄?

?性能從高到低排序

--os_unfair_lock?? ios10之后新出的,版本有兼容要求玛臂。

--OSSpinLock???? ios10廢棄了烤蜕,存在優(yōu)先級反轉(zhuǎn)的問題。

--dispatch_semaphore?? 推薦使用

--pthread_mutex?? 推薦使用

--dispatch_queue(DISPATCH_QUEUE_SERIAL)

--NSLock

--NSCondition

--pthread_mutex(recursive)

--NSRecursiveLock

--NSConditionLock

--@synchronized?? 性能最差不推薦使用垢揩。

11玖绿、自旋鎖、互斥鎖比較?

目前的鎖大體分為:自旋鎖跟互斥鎖叁巨,如果在沒有獲得鎖的情況下自旋鎖的線程不會進(jìn)入休眠斑匪,處于忙等,互斥鎖會進(jìn)入休眠锋勺。

1)什么情況使用自旋鎖比較劃算蚀瘸?

(1)預(yù)計(jì)線程等待鎖的時間很短

(2)加鎖的代碼(臨界區(qū))經(jīng)常被調(diào)用,但競爭情況很少發(fā)生

(3)CPU資源不緊張

(4)多核處理器

2)什么情況使用互斥鎖比較劃算庶橱?

(1)預(yù)計(jì)線程等待鎖的時間較長

(2)單核處理器

(3)臨界區(qū)有IO操作贮勃,IO是比較消耗CPU資源的。

(4)臨界區(qū)代碼復(fù)雜或者循環(huán)量大

(5)臨界區(qū)競爭非常激烈

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末苏章,一起剝皮案震驚了整個濱河市寂嘉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枫绅,老刑警劉巖泉孩,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異并淋,居然都是意外死亡寓搬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門县耽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來句喷,“玉大人,你說我怎么就攤上這事兔毙⊥偾恚” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵瞒御,是天一觀的道長父叙。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么趾唱? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任涌乳,我火速辦了婚禮,結(jié)果婚禮上甜癞,老公的妹妹穿的比我還像新娘夕晓。我一直安慰自己,他們只是感情好悠咱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布蒸辆。 她就那樣靜靜地躺著,像睡著了一般析既。 火紅的嫁衣襯著肌膚如雪躬贡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天眼坏,我揣著相機(jī)與錄音拂玻,去河邊找鬼。 笑死宰译,一個胖子當(dāng)著我的面吹牛檐蚜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沿侈,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼闯第,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缀拭?” 一聲冷哼從身側(cè)響起咳短,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛛淋,沒想到半個月后诲泌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铣鹏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了哀蘑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诚卸。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绘迁,靈堂內(nèi)的尸體忽然破棺而出合溺,到底是詐尸還是另有隱情,我是刑警寧澤缀台,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布棠赛,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏睛约。R本人自食惡果不足惜鼎俘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辩涝。 院中可真熱鬧贸伐,春花似錦、人聲如沸怔揩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽商膊。三九已至伏伐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晕拆,已是汗流浹背藐翎。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留潦匈,地道東北人阱高。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像茬缩,于是被迫代替她去往敵國和親赤惊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

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