NSLock
nslock是互斥鎖孕惜,非遞歸所扭弧,連續(xù)加鎖大于等于兩次[self.lock lock]會(huì)造成死鎖
@synchronized
@synchronized 互斥鎖(當(dāng)中的遞歸鎖)跟(NSLock, 更準(zhǔn)確的說法應(yīng)該是遞歸鎖NSRecursiveLock)類似:它可以防止不同的線程同時(shí)執(zhí)行同一段代碼。但在某些情況下,相比于使用 NSLock 創(chuàng)建鎖對(duì)象、加鎖和解鎖來說,@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è)異常處理例程來保護(hù)代碼,該處理例程會(huì)在異常拋出的時(shí)候自動(dòng)的釋放互斥鎖宝与。
如果在 @sychronized(object){} 內(nèi)部 object 被釋放或被設(shè)為 nil焚廊,從測(cè)試的結(jié)果來看,的確沒有問題习劫,但如果 object 一開始就是
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)系作者