NSLock
nslock是互斥鎖,非遞歸所,連續(xù)加鎖大于等于兩次[self.lock lock]會(huì)造成死鎖
@synchronized
@synchronized 互斥鎖(當(dāng)中的遞歸鎖)跟(NSLock, 更準(zhǔn)確的說(shuō)法應(yīng)該是遞歸鎖NSRecursiveLock)類似:它可以防止不同的線程同時(shí)執(zhí)行同一段代碼。但在某些情況下,相比于使用 NSLock 創(chuàng)建鎖對(duì)象、加鎖和解鎖來(lái)說(shuō),@synchronized 用著更方便,可讀性更高, 自然效率會(huì)比較低。
只有一個(gè)線程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
@synchronized(self) {
sleep(2);
NSLog(@"線程1");
}
sleep(1);
NSLog(@"線程1解鎖成功");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
@synchronized(self) {
NSLog(@"線程2");
}
});
打印 線程1---->線程2----->線程1解鎖成功
@synchronized(object) 指令使用的 object 為該鎖的唯一標(biāo)識(shí),只有當(dāng)標(biāo)識(shí)相同時(shí),才滿足互斥,所以如果線程 2 中的
@synchronized(self) 改為@synchronized(self.view),則線程2就不會(huì)被阻塞
@synchronized 指令實(shí)現(xiàn)鎖的優(yōu)點(diǎn)就是我們不需要在代碼中顯式的創(chuàng)建鎖對(duì)象,便可以實(shí)現(xiàn)鎖的機(jī)制,但作為一種預(yù)防措施,
@synchronized 塊會(huì)隱式的添加一個(gè)異常處理例程來(lái)保護(hù)代碼,該處理例程會(huì)在異常拋出的時(shí)候自動(dòng)的釋放互斥鎖。
如果在 @sychronized(object){} 內(nèi)部 object 被釋放或被設(shè)為 nil,從測(cè)試的結(jié)果來(lái)看,的確沒(méi)有問(wèn)題,但如果 object 一開(kāi)始就是
nil,則失去了鎖的功能。但 @synchronized([NSNull null]) 是完全可以的。
遞歸鎖: 同一個(gè)線程可以重復(fù)的加鎖而不會(huì)導(dǎo)致死鎖(互斥鎖: 同一個(gè)線程重復(fù)加鎖會(huì)導(dǎo)致死鎖) ,加的遞歸鎖全部執(zhí)行完后 才會(huì)把資源讓給別的線程。不同的線程要求加鎖會(huì)陷入等待.
傳入的object必須是有地址的指針的,才能起到加鎖效果,如果傳入的對(duì)象釋放了nil就起不到加鎖的作用。
GCD信號(hào)量 dispatch_semaphore_create(1) 賦值為1就代表鎖
信號(hào)量置為1 每次都只有一個(gè)線程在執(zhí)行
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//任務(wù)1
dispatch_async(queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"run task 1");
sleep(1);
NSLog(@"complete task 1");
dispatch_semaphore_signal(semaphore);
});
//任務(wù)2
dispatch_async(queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"run task 2");
sleep(1);
NSLog(@"complete task 2");
dispatch_semaphore_signal(semaphore);
});
//任務(wù)3
dispatch_async(queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"run task 3");
sleep(1);
NSLog(@"complete task 3");
dispatch_semaphore_signal(semaphore);
});
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。