iOS中的鎖 筆記

<u>會阻塞線程的鎖,都屬于互斥鎖</u>

NSLock

NSLock的lock方法和lockBeforeDate: 方法會阻塞線程;tryLock方法不會阻塞線程。
多個線程同時加鎖時,其他請求鎖的線程按照先進(jìn)先出執(zhí)行。

NSConditionLock

NSConditionLock與NSLock行為相似,只不過可以設(shè)置條件(condition整數(shù)),可以設(shè)置為在滿足condition時才進(jìn)行lockWithCondition:、unlockWithCondition:、tryLockWithCondition: 等操作(當(dāng)然也可以不設(shè)置條件)。

可以使用NSConditionLock設(shè)置線程(任務(wù))間的依賴關(guān)系,用GCD可以結(jié)合著使用進(jìn)行實現(xiàn)

NSRecursiveLock

遞歸鎖。可以在單個線程中返回加鎖或解鎖,其自身會記錄加鎖和解鎖的次數(shù),只有次數(shù)匹配時,才會真正的解鎖,其他線程才可以加鎖成功。

NSLock、NSConditionLock和NSRecursiveLock是先輪詢,之后再進(jìn)入waiting狀態(tài)。

NSCondition

NSCondition由 一個鎖 + 條件檢查器 組成。在每個線程中,都可以對condition對象單獨進(jìn)行lockunlock,不影響其他線程再次加鎖或解鎖。

condition對象調(diào)用wait后,直接進(jìn)入waiting狀態(tài),阻塞當(dāng)前線程執(zhí)行。等待其他線程對condition調(diào)用signalbroadcast 后,喚醒1個或所有的waiting線程,繼續(xù)向下執(zhí)行。

以上四種鎖都是遵循NSLocking協(xié)議。

@synchronized

@synchronized同步鎖會將指定的參數(shù)對象進(jìn)行加鎖。只有對相同對象進(jìn)行加鎖時,后加鎖的線程才會被阻塞。否則無效。

dispatch_semaphore

信號量是GCD進(jìn)行同步的一種方式。
通過dispatch_semaphore_create創(chuàng)建信號量(指定信號值,即同時執(zhí)行的任務(wù)數(shù))。dispatch_semaphore_wait函數(shù)會對信號值進(jìn)行檢測:當(dāng)信號值大于1時,信號值減1,繼續(xù)向下執(zhí)行任務(wù),在信號值是1的信號量中,相當(dāng)于加鎖操作;當(dāng)信號值為0時,調(diào)用線程被阻塞。只有當(dāng)其他線程調(diào)用dispatch_semaphpre_signal進(jìn)行信號恢復(fù)后(保證信號值重新大于0),被阻塞的線程繼續(xù)向下執(zhí)行。

**dispatch_semaphore與NSCondition都是基于信號的鎖,區(qū)別是信號量會保存發(fā)送的信號,NSCondition則不可以(只能signal)。

OSSpinLock

自旋鎖現(xiàn)在已經(jīng)不建議使用了,具體原因見上面(優(yōu)先級反轉(zhuǎn)造成死鎖)。
蘋果推薦使用<os/lock.h>中的os_unfair_lock() 鎖替代。

自旋鎖與互斥鎖都是搶占式,任何時候都只能有一個保持者。區(qū)別是:互斥鎖中,調(diào)用者在別的運算單元搶占鎖后進(jìn)入睡眠,等待結(jié)束后被喚醒進(jìn)行搶占;自旋鎖,調(diào)用者在被運算單元搶占鎖后不睡眠,循環(huán)查看自旋鎖是否被釋放。
故自旋鎖適合保持鎖時間較短的情況,這種情況下其效率遠(yuǎn)高于互斥鎖。

缺點:需要獲取鎖的線程優(yōu)先級相同。如果低優(yōu)先級的線程獲得鎖后,高優(yōu)先級線程會處于busy-wait狀態(tài),占用大量CPU。而低優(yōu)先級線程無法獲取CPU時間,導(dǎo)致任務(wù)無法完成,也就無法釋放鎖。造成死鎖(優(yōu)先級反轉(zhuǎn))。

參考資料:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 鎖是一種同步機(jī)制,用于多線程環(huán)境中對資源訪問的限制iOS中常見鎖的性能對比圖(摘自:ibireme): iOS鎖的...
    LiLS閱讀 1,631評論 0 6
  • 自旋鎖和互斥鎖 共同點:都能保證同一時刻只能有一個線程操作鎖住的代碼。都能保證線程安全。不同點: 互斥鎖(mute...
    中軸線_lz閱讀 807評論 0 0
  • 在平時的開發(fā)中經(jīng)常使用到多線程,在使用多線程的過程中,難免會遇到資源競爭的問題,那我們怎么來避免出現(xiàn)這種問題那? ...
    IAMCJ閱讀 3,332評論 2 25
  • 線程安全是什么? 當(dāng)一個線程訪問數(shù)據(jù)的時候,其他的線程不能對其進(jìn)行訪問,直到該線程訪問完畢。簡單來講就是在同一時刻...
    6ffd6634d577閱讀 2,272評論 1 7
  • 可能是因為時差的關(guān)系,雖然沒有覺得太累,卻反應(yīng)在起床時間上。我一直認(rèn)為自己的睡眠質(zhì)量是很高的,而且不認(rèn)床,從來沒有...
    蝴蝶穿花閱讀 876評論 0 4

友情鏈接更多精彩內(nèi)容