自旋鎖有:atomic, OSSpinLock, dispatch_semaphore_t.
是一種用于保護(hù)多線程共享資源的鎖琉苇,與一般互斥鎖(mutex)不同之處在于當(dāng)自旋鎖嘗試獲取鎖時(shí)以忙等待(busy waiting)的形式不斷地循環(huán)檢查鎖是否可用圃酵。當(dāng)上一個(gè)線程的任務(wù)沒(méi)有執(zhí)行完畢的時(shí)候(被鎖住)鼎姐,那么下一個(gè)線程會(huì)一直等待(不會(huì)睡眠),當(dāng)上一個(gè)線程的任務(wù)執(zhí)行完畢更振,下一個(gè)線程會(huì)立即執(zhí)行炕桨。
在多CPU的環(huán)境中,對(duì)持有鎖較短的程序來(lái)說(shuō)肯腕,使用自旋鎖代替一般的互斥鎖往往能夠提高程序的性能献宫。
自旋鎖會(huì)忙等: 所謂忙等,即在訪問(wèn)被鎖資源時(shí)乎芳,調(diào)用者線程不會(huì)休眠遵蚜,而是不停循環(huán)在那里,直到被鎖資源釋放鎖奈惑。
互斥鎖有:@ synchronized,NSLock, pthread_mutex, NSConditionLock, NSCondition, NSRecursiveLock.
互斥鎖當(dāng)上一個(gè)線程的任務(wù)沒(méi)有執(zhí)行完畢的時(shí)候(被鎖卓跃弧),那么下一個(gè)線程會(huì)進(jìn)入睡眠狀態(tài)等待任務(wù)執(zhí)行完畢肴甸,當(dāng)上一個(gè)線程的任務(wù)執(zhí)行完畢寂殉,下一個(gè)線程會(huì)自動(dòng)喚醒然后執(zhí)行任務(wù)。
互斥鎖會(huì)休眠: 所謂休眠原在,即在訪問(wèn)被鎖資源時(shí)友扰,調(diào)用者線程會(huì)休眠,此時(shí)cpu可以調(diào)度其他線程工作庶柿。直到被鎖資源釋放鎖村怪。此時(shí)會(huì)喚醒休眠線程。
優(yōu)缺點(diǎn):
自旋鎖的優(yōu)點(diǎn)在于浮庐,因?yàn)樽孕i不會(huì)引起調(diào)用者睡眠甚负,所以不會(huì)進(jìn)行線程調(diào)度,CPU時(shí)間片輪轉(zhuǎn)等耗時(shí)操作。所有如果能在很短的時(shí)間內(nèi)獲得鎖梭域,自旋鎖的效率遠(yuǎn)高于互斥鎖斑举。
缺點(diǎn)在于,自旋鎖一直占用CPU病涨,他在未獲得鎖的情況下富玷,一直運(yùn)行--自旋,所以占用著CPU既穆,如果不能在很短的時(shí) 間內(nèi)獲得鎖赎懦,這無(wú)疑會(huì)使CPU效率降低。自旋鎖不能實(shí)現(xiàn)遞歸調(diào)用循衰。
現(xiàn)在的iOS因?yàn)閮?yōu)先級(jí)反轉(zhuǎn)的問(wèn)題铲敛,已經(jīng)不安全,所以推薦使用pthread_mutex或者dispatch_semaphore会钝。