iOS中的鎖筆記

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


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

鎖的分類

自旋鎖:在未獲取到鎖的情況下,線程會(huì)反復(fù)檢查鎖變量是否可用,處于一直忙等狀態(tài),所以不會(huì)進(jìn)行上下文切換,適用于阻塞很短時(shí)間的場(chǎng)景,常見(jiàn)的鎖有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)問(wèn)題,可能導(dǎo)致優(yōu)先級(jí)高的線程一直處于忙等狀態(tài),而優(yōu)化級(jí)低的線程又拿不到鎖,所以ios10開(kāi)始已被os_unfair_lock取代。

dispatch_semaphore

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

pthread_mutex、NSLock、NSRecursiveLock

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

NSCondition、NSConditionLock

其底層是使用的互斥鎖,但在此基礎(chǔ)上增加了線程間通訊的能力,通過(guò)相應(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容