iOS開發(fā)中的各種鎖
- OSSpinlock
- os_unfair_lock
- dispath_semaphore
- pthread_mutex
- pthread_rwlock
- pthread_cond
- NSCondition
- NSConditionLock
- NSLock
- NSCuresiveLock
- @synchronized
鎖兒們
自旋鎖
性能最高的鎖裂垦。
原理:如果共享數(shù)據(jù)被其他線程加鎖,那么當(dāng)前線程會(huì)一死循環(huán)的方式等待解鎖,一旦訪問的資源被解鎖扁位,則等待線程就會(huì)立即執(zhí)行线罕。
由此可見坚芜,如果共享資源被鎖了旅赢,線程不會(huì)進(jìn)入等待狀態(tài),他會(huì)循環(huán)的鎖的狀態(tài)激捏,所以實(shí)際上會(huì)消耗CPU的資源设塔。
也就是說,在較為耗時(shí)的操作远舅,并不適合使用自旋鎖闰蛔。比如:讀寫硬盤這種就不適合用自旋鎖。而讀寫緩存图柏,和內(nèi)存可以是用自旋鎖序六。
為什么自選鎖的性能會(huì)比較高:
主動(dòng)出讓時(shí)間片(也就是互斥的做法)會(huì)導(dǎo)致操作系統(tǒng)切換到另外一個(gè)縣城,這種上下文切換會(huì)通常占用10微妙左右的時(shí)間爆办,來回調(diào)度起碼就是兩次难咕。所以如果等待時(shí)間特別短,可能只有幾個(gè)微妙距辆,那么自旋鎖的忙等明顯要比互斥鎖的休眠更加高效。
iOS的自旋鎖:
- OSSpinlock:iOS10以后被廢棄暮刃,因其不安全跨算,有可能造成死鎖。
- os_unfair_lock:iOS之后才可以使用椭懊,代替
OSSpinlock
的方案
在iOS
中線程優(yōu)先級(jí)有五個(gè)(QoS):
- QOS_CLASS_BACKGROUND
- QOS_CLASS_UTILITY
- QOS_CLASS_UTILITY
- QOS_CLASS_USER_INITATED
- QOS_CLASS_USER_INTERACTIVE
由上到下是低到高诸蚕。
GCD是四個(gè)級(jí)別:
- Dispath_QUEUE_PRIORITY_HIGH
相當(dāng)于 QOS_CLASS_USER_INITATED
- Dispath_QUEUE_PRIORITY_DEFAULT
相當(dāng)于 QOS_CLASS_DEFAULT
- Dispath_QUEUE_PRIORITY_LOW
相當(dāng)于 QOS_CLASS_UTILITY
- Dispath_QUEUE_PRIORITY_BACKGROUND
相當(dāng)于 QOS_CLASS_BACKGROUND
OSSpinlock可能造成死鎖的原因:
有可能在優(yōu)先級(jí)比較低的線程里對共享資源進(jìn)行加鎖了,然后高優(yōu)先級(jí)的線程搶占了低優(yōu)先級(jí)的調(diào)用CPU時(shí)間氧猬,導(dǎo)致高優(yōu)先級(jí)的線程一直在等待低優(yōu)先級(jí)的線程釋放鎖背犯,然而低優(yōu)先級(jí)根本沒法搶占高優(yōu)先級(jí)的CPU時(shí)間。
這種情況我們稱作 優(yōu)先級(jí)倒轉(zhuǎn)盅抚。
互斥鎖:
原理:如果共享資源已經(jīng)有其他線程加鎖了漠魏,線程會(huì)進(jìn)入休眠狀態(tài)等待鎖。一旦被訪問的資源被解鎖妄均,則等待資源的線程會(huì)被喚醒柱锹。
互斥鎖不會(huì)同時(shí)被兩個(gè)不同的線程同時(shí)得到。也就是如果是當(dāng)前線程加的鎖丰包,別的線程是沒有辦法獲取這個(gè)鎖禁熏,也就沒有辦法對他進(jìn)行解鎖。
iOS中的互斥鎖
- pthread_mutex
- NSLock
- NSCuresiveLock
- @synchronized
互斥鎖屬性:
- PTHREAD_MUTEX_NORMAL 0:普通鎖
當(dāng)一個(gè)線程獲得鎖以后邑彪,其余請求鎖的線程講形成一個(gè)等待隊(duì)列瞧毙,并在解鎖后按優(yōu)先級(jí)獲得鎖。
- PTHREAD_MUTEX_ERRORCHECK 1:檢錯(cuò)鎖
如果同一個(gè)線程多次請求同一個(gè)鎖,則返回錯(cuò)誤宙彪,否則按照
PTHREAD_MUTEX_NORMAL
邏輯來
- PTHREAD_MUTEX_RECURSIVE 2:嵌套鎖
允許同一個(gè)線程對同一個(gè)鎖獲得多次矩动,也可以解鎖多次。如果多個(gè)線程請求您访,也是需要等解鎖之后才能競爭铅忿。
- PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL
讀寫鎖
原理:允許多個(gè)線程同時(shí)對同一個(gè)數(shù)據(jù)進(jìn)行讀操作,而只允許一個(gè)線程進(jìn)行寫操作灵汪。這是因?yàn)樽x操作不會(huì)改變數(shù)據(jù)的內(nèi)容檀训,是安全的;而寫操作會(huì)改變數(shù)據(jù)的內(nèi)容享言,是不安全的峻凫。
iOS中的讀寫鎖
- pthread_rwlock_t
條件鎖
原理:進(jìn)入等待,直到滿足條件后執(zhí)行览露。
iOS中的條件鎖
- NSCondition
- NSConditionLock
- pthread_cond
信號(hào)量加鎖
原理:多元信號(hào)量允許多個(gè)線程訪問同一個(gè)資源荧琼,多元信號(hào)量簡稱信號(hào)量(Semaphore),對于允許多個(gè)線程并發(fā)訪問的資源差牛,這是一個(gè)很好的選擇命锄。一個(gè)初始值為N的信號(hào)量允許N個(gè)線程并發(fā)訪問。
其實(shí)嚴(yán)格的來說信號(hào)量不能算鎖偏化。
而且如果信號(hào)量設(shè)置為1脐恩,我們可以把它當(dāng)作互斥鎖來用
iOS中的信號(hào)量加鎖
- dispatch_semaphore