你用過哪些鎖?對于鎖的種類你了解多少幻件?鎖的原理知道否拨黔?從本篇博客開始將對鎖
的相關內容進行分析!
iOS底層探索之多線程(六)—GCD源碼分析(sync 同步函數篱蝇、async 異步函數)
iOS底層探索之多線程(八)—GCD源碼分析(函數的同步性、異步性徽曲、單例)
1.鎖的介紹
在 iOS 中有以下九種鎖
-
OSSpinLock
:(自旋鎖) -
dispatch_semaphore_t
:(信號量/互斥鎖) -
os_unfair_lock_lock
:(自旋鎖) -
pthread_mutex_t
:(互斥遞歸鎖) -
NSLock
:(互斥鎖) -
NSCondition
:(條件鎖) -
NSRecursiveLock
:(遞歸鎖) -
NSConditionLock
:(條件鎖) -
@synchronized
:(內部是互斥鎖)
通過對以上的
鎖
進行加鎖/解鎖
10萬次的測試表現零截,結果如下
-
iPhone12 模擬器
iPhone12 模擬器
-
性能測試統計圖表如下
iPhone12 模擬器
-
iPhoneXR 模擬器
iPhoneXR 模擬器 -
iPhoneXR 真機
iPhoneXR 真機
通過以上測試,鎖
的性能最好的前三位是:OSSpinLock
(自旋鎖) ->dispatch_semaphone
(信號量) ->pthread_mutex
(互斥鎖) 秃臣,最差的是synchronized
(互斥鎖)涧衙,但也是我們最常用的鎖之一。
2. 鎖的分類
鎖分為兩大類奥此,自旋鎖
和互斥鎖
弧哎。
自旋鎖
是一種用于保護多線程共享資源
的鎖,與一般互斥鎖
(mutex
)不同之處在于當自旋鎖嘗試獲取鎖時以忙等待
(busy waiting
)的形式不斷地循環(huán)檢查鎖是否可用稚虎。當上一個線程的任務沒有執(zhí)行完畢的時候(被鎖壮纺邸),那么下一個線程會一直等待(不會睡眠)蠢终,當上一個線程的任務執(zhí)行完畢序攘,下一個線程會立即執(zhí)行茴她。
在多CPU的環(huán)境中,對持有鎖較短的程序來說程奠,使用自旋鎖代替一般的互斥鎖往往能夠提高程序的性能丈牢。
自旋鎖:OSSpinLock(自旋鎖)、讀寫鎖
- 自旋鎖
- OSSpinLock
- os_unfair_lock_lock
- 互斥鎖
- pthread_mutex_t
- NSLock
- NSCondition
- NSRecursiveLock
- NSConditionLock
- dispatch_semaphore_t
- @synchronized (內部是)
互斥鎖
當上一個線程的任務沒有執(zhí)行完畢的時候(被鎖酌稳尽)赡麦,那么下一個線程會進入睡眠狀態(tài)等待任務執(zhí)行完畢,當上一個線程的任務執(zhí)行完畢帕识,下一個線程會自動喚醒然后執(zhí)行任務泛粹,該任務也不會立刻執(zhí)行,而是成為可執(zhí)行狀態(tài)(就緒)肮疗。
互斥鎖
(mutex)晶姊,?于保證在任何時刻,都只能有?個線程訪問該對象伪货。
mutex函數
在Posix Thread
中定義有?套專??于線程同步的mutex
函數们衙。mutex
?于保證在任何時刻,都只能有?個線程訪問該對象碱呼。當獲取鎖操作失敗時蒙挑,線程會進?睡眠,等待鎖釋放時被喚醒愚臀。NSLock忆蚀、NSCondtion、NSRecursiveLock
底層都是對pthread
的封裝姑裂。
互斥和同步的理解
互斥
:兩條線程處理馋袜,同一時間只有一個線程可以運行;
同步
:除了有互斥的意思外舶斧,同時還有一定的順序要求欣鳖,即按照一定的順序執(zhí)行。
遞歸鎖
就是同?個線程可以加鎖N次?不會引發(fā)死鎖NSRecursiveLock茴厉、@synchronized泽台、pthread_mutex(recursive)
互斥鎖
:pthread_mutex(互斥鎖)、@synchronized(互斥鎖)矾缓、NSLock(互斥鎖)
怀酷、NSConditionLock(條件鎖)
、NSCondition(條件鎖)
而账、NSRecursiveLock(遞歸鎖)
、dispatch_semaphore_t(信號量)
自旋鎖和互斥鎖的特點
自旋鎖
會忙等
因篇,所謂忙等泞辐,即在訪問被鎖資源時笔横,調用者線程不會休眠,而是一直地不停循環(huán)在那里咐吼,直到被鎖資源釋放鎖吹缔,就和上 WC
一樣,里面有人了锯茄,門鎖住了厢塘,你一直在門外等著,一直敲門詢問
肌幽,好了嗎晚碾?好了沒有啊喂急?廊移。
互斥鎖
會休眠
,所謂休眠狡孔,即在訪問被鎖資源時懂诗,調用者線程會休眠殃恒,此時cpu
可以調度其他線程工作,直到被鎖資源釋放鎖,此時會喚醒休眠線程贮竟。就是你知道廁所有人了,你先憋著,不會一直敲門詢問偿短,等里面的人好了降传,你在就去。
自旋鎖優(yōu)缺點
優(yōu)點
在于,因為自旋鎖不會引起調用者睡眠翼悴,所以不會進行線程調度误堡,CPU
時間片輪轉等耗時操作,所有如果能在很短的時間內獲得鎖肩狂,自旋鎖
的效率遠高于互斥鎖
。
缺點
在于,自旋鎖一直占用CPU态蒂,他在未獲得鎖的情況下瘩蚪,一直運行自旋闻察,所以占用著CPU,如果不能在很短的時間內獲得鎖,這無疑會使CPU效率降低。自旋鎖不能實現遞歸調用奖年。
3. 鎖的作用
在編程中水评,特別是多線程開發(fā)者中媚送,來保證共享數據
操作的完整性中燥。假如有 ABC三條甚至更多的線程褪那,同時去訪問資源,那么讀的話是沒有問題式塌,要是寫的話博敬,就可能出問題伦意,同時修改了某一個數據已骇,這樣就破壞的數據的完整性
了。
而加鎖
的話鲤竹,就是同一個時間浪读,只能有一個個線程訪問
,其他的靠邊等待辛藻,可以給每個對象都對應于一個可稱為"互斥鎖
" 的標記碘橘,這個標記用來保證在任一時刻,只能有一個線程訪問該對象岩榆。
下篇博客將對鎖進行舉例并對底層進行分析错负,敬請期待!
更多內容持續(xù)更新
?? 喜歡就點個贊吧????
?? 覺得有收獲的勇边,可以來一波犹撒,收藏+關注,評論 + 轉發(fā)粒褒,以免你下次找不到我????
??歡迎大家留言交流识颊,批評指正,互相學習??,提升自我??