首先借鑒一張ibireme各種鎖性能對(duì)比圖鎮(zhèn)樓
自旋鎖與互斥鎖的區(qū)別
從實(shí)現(xiàn)原理上來講,互斥鎖屬于sleep-waiting類型的鎖。例如在一個(gè)雙核的機(jī)器上有兩個(gè)線程(線程A和線程B),它們分別運(yùn)行在Core0和 Core1上。假設(shè)線程A想要通過pthread_mutex_lock操作去得到一個(gè)臨界區(qū)的鎖,而此時(shí)這個(gè)鎖正被線程B所持有,那么線程A就會(huì)被阻塞 (blocking)脓匿,Core0 會(huì)在此時(shí)進(jìn)行上下文切換(Context Switch)將線程A置于等待隊(duì)列中,此時(shí)Core0就可以運(yùn)行其他的任務(wù)(例如另一個(gè)線程C)而不必進(jìn)行忙等待宦赠。而Spin lock則不然陪毡,它屬于busy-waiting類型的鎖米母,如果線程A是使用pthread_spin_lock操作去請(qǐng)求鎖,那么線程A就會(huì)一直在 Core0上進(jìn)行忙等待并不停的進(jìn)行鎖請(qǐng)求毡琉,直到得到這個(gè)鎖為止铁瞒。
自旋鎖與互斥鎖有點(diǎn)類似,只是自旋鎖不會(huì)引起調(diào)用者睡眠桅滋,如果自旋鎖已經(jīng)被別的執(zhí)行單元保持慧耍,調(diào)用者就一直循環(huán)在那里看是 否該自旋鎖的保持者已經(jīng)釋放了鎖。
總結(jié):
自旋鎖會(huì)忙等: 所謂忙等丐谋,即在訪問被鎖資源時(shí)芍碧,調(diào)用者線程不會(huì)休眠,而是不停循環(huán)在那里号俐,直到被鎖資源釋放鎖泌豆。
互斥鎖會(huì)休眠: 所謂休眠,即在訪問被鎖資源時(shí)吏饿,調(diào)用者線程會(huì)休眠踪危,此時(shí)cpu可以調(diào)度其他線程工作。直到被鎖資源釋放鎖猪落。此時(shí)會(huì)喚醒休眠線程陨倡。
優(yōu)缺點(diǎn):
自旋鎖的優(yōu)點(diǎn)在于,因?yàn)樽孕i不會(huì)引起調(diào)用者睡眠许布,所以不會(huì)進(jìn)行線程調(diào)度,cpu時(shí)間片輪轉(zhuǎn)等耗時(shí)操作绎晃。所有如果能在很短的時(shí)間內(nèi)獲得鎖蜜唾,自旋鎖的效率遠(yuǎn)高于互斥鎖。
缺點(diǎn)在于庶艾,自旋鎖一直占用CPU袁余,他在未獲得鎖的情況下,一直運(yùn)行--自旋咱揍,所以占用著CPU颖榜,如果不能在很短的時(shí) 間內(nèi)獲得鎖,這無疑會(huì)使CPU效率降低煤裙。自旋鎖不能實(shí)現(xiàn)遞歸調(diào)用掩完。
pthread_mutex 表示互斥鎖∨鹋椋互斥鎖可以傳入不同參數(shù)且蓬,實(shí)現(xiàn)遞歸鎖pthread_mutex(recursive)。NSLock题翰,NSCondition恶阴,NSRecursiveLock诈胜,NSConditionLock都是內(nèi)部封裝的pthread_mutex,即都屬于互斥鎖冯事。@synchronized是NSLock的一種封裝焦匈,犧牲了效率,簡潔了語法昵仅。
OSSpinLock 表示自旋鎖缓熟,從上圖可以看到自旋鎖的效率最高,但是現(xiàn)在的iOS因?yàn)閮?yōu)先級(jí)反轉(zhuǎn)的問題岩饼,已經(jīng)不安全荚虚,所以推薦使用pthread_mutex或者dispatch_semaphore。
具體各種鎖的內(nèi)部實(shí)現(xiàn)等詳情籍茧,參考: 深入理解iOS開發(fā)中的鎖