首先借鑒一張ibireme各種鎖性能對比圖鎮樓
自旋鎖與互斥鎖的區別
從實現原理上來講,互斥鎖屬于sleep-waiting類型的鎖。例如在一個雙核的機器上有兩個線程(線程A和線程B),它們分別運行在Core0和 Core1上。假設線程A想要通過pthread_mutex_lock操作去得到一個臨界區的鎖,而此時這個鎖正被線程B所持有,那么線程A就會被阻塞 (blocking),Core0 會在此時進行上下文切換(Context Switch)將線程A置于等待隊列中,此時Core0就可以運行其他的任務(例如另一個線程C)而不必進行忙等待。而Spin lock則不然,它屬于busy-waiting類型的鎖,如果線程A是使用pthread_spin_lock操作去請求鎖,那么線程A就會一直在 Core0上進行忙等待并不停的進行鎖請求,直到得到這個鎖為止。
自旋鎖與互斥鎖有點類似,只是自旋鎖不會引起調用者睡眠,如果自旋鎖已經被別的執行單元保持,調用者就一直循環在那里看是 否該自旋鎖的保持者已經釋放了鎖。
總結:
自旋鎖會忙等: 所謂忙等,即在訪問被鎖資源時,調用者線程不會休眠,而是不停循環在那里,直到被鎖資源釋放鎖。
互斥鎖會休眠: 所謂休眠,即在訪問被鎖資源時,調用者線程會休眠,此時cpu可以調度其他線程工作。直到被鎖資源釋放鎖。此時會喚醒休眠線程。
優缺點:
自旋鎖的優點在于,因為自旋鎖不會引起調用者睡眠,所以不會進行線程調度,cpu時間片輪轉等耗時操作。所有如果能在很短的時間內獲得鎖,自旋鎖的效率遠高于互斥鎖。
缺點在于,自旋鎖一直占用CPU,他在未獲得鎖的情況下,一直運行--自旋,所以占用著CPU,如果不能在很短的時 間內獲得鎖,這無疑會使CPU效率降低。自旋鎖不能實現遞歸調用。
pthread_mutex 表示互斥鎖。互斥鎖可以傳入不同參數,實現遞歸鎖pthread_mutex(recursive)。NSLock,NSCondition,NSRecursiveLock,NSConditionLock都是內部封裝的pthread_mutex,即都屬于互斥鎖。@synchronized是NSLock的一種封裝,犧牲了效率,簡潔了語法。
OSSpinLock 表示自旋鎖,從上圖可以看到自旋鎖的效率最高,但是現在的iOS因為優先級反轉的問題,已經不安全,所以推薦使用pthread_mutex或者dispatch_semaphore。
具體各種鎖的內部實現等詳情,參考: 深入理解iOS開發中的鎖