鎖 是什么意思放前?
我們在使用多線程的時候多個線程可能會訪問同一塊資源,這樣就很容易引發(fā)數(shù)據(jù)錯亂和數(shù)據(jù)安全等問題,這時候就需要我們保證每次只有一個線程訪問這一塊資源彼水,鎖?應(yīng)運而生。
OSSpinLock2
在?OSSpinLock1?圖中可以發(fā)現(xiàn):當我們鎖住線程1時极舔,在同時鎖住線程2的情況下凤覆,線程2會一直等待(自旋鎖不會讓等待的進入睡眠狀態(tài)),直到線程1的任務(wù)執(zhí)行完且解鎖完畢拆魏,線程2會立即執(zhí)行盯桦;而在?OSSpinLock2?圖中,因為我們注釋掉了線程1中的解鎖代碼渤刃,會繞過線程1拥峦,直到調(diào)用了線程2的解鎖方法才會繼續(xù)執(zhí)行線程1中的任務(wù),正常情況下卖子,lock和unlock最好成對出現(xiàn)略号。
這里順便提一下trylock和lock使用場景:
當前線程鎖失敗,也可以繼續(xù)其它任務(wù)洋闽,用 trylock 合適
當前線程只有鎖成功后璃哟,才會做一些有意義的工作,那就 lock喊递,沒必要輪詢 trylock
dispatch_semaphore 信號量
dispatch_semaphore_create(1):?傳入值必須?>=0, 若傳入為?0?則阻塞線程并等待timeout,時間到后會執(zhí)行其后的語句
dispatch_semaphore_wait(signal, overTime):可以理解為?lock,會使得?signal?值?-1
dispatch_semaphore_signal(signal):可以理解為?unlock,會使得?signal?值?+1
停車場剩余4個車位随闪,那么即使同時來了四輛車也能停的下。如果此時來了五輛車骚勘,那么就有一輛需要等待铐伴。
信號量的值(signal)就相當于剩余車位的數(shù)目撮奏,dispatch_semaphore_wait?函數(shù)就相當于來了一輛車,dispatch_semaphore_signal?就相當于走了一輛車当宴。停車位的剩余數(shù)目在初始化的時候就已經(jīng)指明了(dispatch_semaphore_create(long value))畜吊,調(diào)用一次 dispatch_semaphore_signal,剩余的車位就增加一個户矢;調(diào)用一次dispatch_semaphore_wait 剩余車位就減少一個玲献;當剩余車位為 0 時,再來車(即調(diào)用 dispatch_semaphore_wait)就只能等待梯浪。有可能同時有幾輛車等待一個停車位捌年。有些車主沒有耐心,給自己設(shè)定了一段等待時間挂洛,這段時間內(nèi)等不到停車位就走了礼预,如果等到了就開進去停車。而有些車主就像把車停在這虏劲,所以就一直等下去托酸。
pthread_mutex 互斥鎖
pthread_mutex 中也有個pthread_mutex_trylock(&pLock),和上面提到的?OSSpinLockTry(&oslock)區(qū)別在于柒巫,前者可以加鎖時返回的是?0励堡,否則返回一個錯誤提示碼;后者返回的?YES和NO
pthread_mutex(recursive) 遞歸鎖
經(jīng)過上面幾種例子堡掏,我們可以發(fā)現(xiàn):加鎖后只能有一個線程訪問該對象应结,后面的線程需要排隊,并且 lock 和 unlock 是對應(yīng)出現(xiàn)的布疼,同一線程多次 lock 是不允許的摊趾,而遞歸鎖允許同一個線程在未釋放其擁有的鎖時反復對該鎖進行加鎖操作。
NSLock 普通鎖
lock游两、unlock:不多做解釋砾层,和上面一樣
trylock:能加鎖返回 YES 并執(zhí)行加鎖操作,相當于 lock贱案,反之返回 NO
lockBeforeDate:這個方法表示會在傳入的時間內(nèi)嘗試加鎖肛炮,若能加鎖則執(zhí)行加鎖操作并返回 YES,反之返回 NO
NSCondition
wait:進入等待狀態(tài)
waitUntilDate::讓一個線程等待一定的時間
signal:喚醒一個等待的線程
broadcast:喚醒所有等待的線程
NSRecursiveLock 遞歸鎖
上面已經(jīng)大概介紹過了:
遞歸鎖可以被同一線程多次請求宝踪,而不會引起死鎖侨糟。這主要是用在循環(huán)或遞歸操作中。
@synchronized 條件鎖
@synchronized 相信大家應(yīng)該都熟悉瘩燥,它的用法應(yīng)該算這些鎖中最簡單的:
NSConditionLock 條件鎖
NSConditionLock
相比于 NSLock 多了個?condition?參數(shù)秕重,我們可以理解為一個條件標示。
從上面的結(jié)果我們可以發(fā)現(xiàn)厉膀,NSConditionLock 還可以實現(xiàn)任務(wù)之間的依賴溶耘。