本文只是我對(duì)iOS中鎖的學(xué)習(xí)筆記,沒有太深入的研究講解磺浙。先來一張ios中常用鎖的性能對(duì)照?qǐng)D
鎖的分類
自旋鎖:在未獲取到鎖的情況下稻轨,線程會(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:鎖的原理