iOS中使用的鎖主要包括以下幾種:
1. ?@synchronized:
這是一個Objective-C提供的同步指令夕凝,用于保護臨界區(qū)代碼厘肮。
它通過給定的對象作為鎖的唯一標識类茂,確保同一標識的線程互斥訪問臨界區(qū)。
@synchronized指令內(nèi)部使用一個哈希表來存儲和檢索互斥鎖啤月,當線程進入臨界區(qū)時,會先檢查該鎖是否被占用轻抱。
2. ?NSLock:
NSLock是一個簡單的互斥鎖類。
它提供了基本的加鎖和解鎖操作,用于同步訪問共享資源容燕。
NSLock是非遞歸的梁呈,意味著同一線程在已經(jīng)持有鎖的情況下再次調(diào)用lock方法會導(dǎo)致死鎖。
3. ?NSRecursiveLock:
這是一個遞歸鎖蘸秘,允許同一線程多次獲取同一把鎖而不會導(dǎo)致死鎖官卡。
當一個線程已經(jīng)持有鎖時,它可以再次調(diào)用lock方法而不會阻塞醋虏。
當該線程調(diào)用unlock方法時寻咒,鎖的計數(shù)會遞減,直到計數(shù)為0時颈嚼,其他線程才能獲取該鎖仔涩。
4. ?NSCondition #I NSConditionLock:
這兩個類提供了條件變量和條件鎖的功能。
NSCondition允許線程等待某個條件成立粘舟,或者喚醒等待該條件的線程。
NSConditionLock允許更復(fù)雜的鎖定策略佩研,可以基于特定的條件來鎖定和解鎖柑肴。
5. 0SSpinLock(已奔用):
? OSSpinLock是一個自旋鎖,用于多線程同步旬薯。
? 當線程嘗試獲取鎖時晰骑,如果鎖不可用,線程會忙等待(即不斷循環(huán)檢查鎖是否可用),而不是進入休眠狀態(tài)硕舆。
? 由于自旋鎖在等待過程中會消耗CPU資源秽荞,因此適用于鎖競爭不激烈且等待時間短的場
? 注意:OSSpinLock在I0S 10及更高版本已被棄用,因為它在某些情況下可能導(dǎo)致優(yōu)先級反轉(zhuǎn)問題抚官。
6. ?dispatch_semaphore:
?這是一個信號量扬跋,用于控制對共享資源的訪問。
?信號量有一個計數(shù)值凌节,當線程需要訪問共享資源時钦听,會嘗試減少信號量的計數(shù)值;如果計數(shù)值為0倍奢,則線程會阻塞等待朴上。
? 當其他線程釋放共享資源并增加信號量的計數(shù)值時,等待的線程會被喚醒并繼續(xù)執(zhí)行卒煞。
7. os_unfair_lock:
?這是一個不公平鎖痪宰,提供了高性能的同步機制。
? 與傳統(tǒng)的互斥鎖相比畔裕,它可能允許某些線程連續(xù)獲得鎖衣撬,而其他線程則可能長時間得不到鎖。
? 因此柴钻,它適用于對性能敏感且可以接受一定程度不公乎性的場景淮韭。
os_unfair_lock
os_unfair_lock是iOS 10.0以后出現(xiàn)的一種鎖,旨在替代OSSpinLock贴届。
其核心原理:
在嘗試獲取已加鎖的線程時靠粪,不會進行忙等待(busy-waiting),而是使線程進入睡眠狀態(tài)毫蚓。這種設(shè)計可以避免優(yōu)先級反轉(zhuǎn)的問題占键,因為在高優(yōu)先級的線程等待低優(yōu)先級線程釋放鎖時,低優(yōu)先級線程可能會一直持有鎖元潘,導(dǎo)致高優(yōu)先級線程無法獲取鎖畔乙,從而影響系統(tǒng)性能。
os_unfair_lock的初始化:
通過os_unfair_lock_init函數(shù)完成翩概,
嘗試加鎖通過:
os_unfair_lock_try函數(shù)牲距,
真正加鎖通過:
os_unfair_lock_lock函數(shù),
解鎖則通過:
os_unfair_lock_unlock函數(shù)
os_unfair_lock局限性:
例如可能導(dǎo)致饑餓(starvation)問題钥庇。具體來說牍鞠,當一個線程釋放鎖后,等待該鎖的線程可能沒有機會立即獲取到鎖评姨,因為其他線程可能立即再次獲取該鎖难述。這可能導(dǎo)致某些線程長時間無法獲取到鎖,從而影響系統(tǒng)的公平性和性能。
總的來說:
os_unfair_lock是一種底層鎖機制胁后,其設(shè)計旨在提高性能并避免優(yōu)先級反轉(zhuǎn)問題店读,但也需要注意其可能帶來的饑餓問題。在實際應(yīng)用中攀芯,應(yīng)根據(jù)具體需求選擇合適的鎖機制屯断。
最后,總之:
這些鎖在iOS鄉(xiāng)線程編程中各有其用途和適用場景敲才,開發(fā)者應(yīng)根據(jù)具體需求選擇合適的鎖來確保線程安全和資源同步裹纳。同時,也需要注意避免死鎖和競態(tài)條件等潛在問題紧武。