在iOS中有幾種方法來解決多線程訪問同一個(gè)內(nèi)存地址的互斥同步問題:
方法一,@synchronized(id anObject),(最簡單的方法)會(huì)自動(dòng)對(duì)參數(shù)對(duì)象加鎖,保證臨界區(qū)內(nèi)的代碼線程安全
[cpp] view plain copy PRint?@synchronized(self) { // 這段代碼對(duì)其他 @synchronized(self) 都是互斥的 // self 指向同一個(gè)對(duì)象 }方法二,NSLockNSLock對(duì)象實(shí)現(xiàn)了NSLocking protocol,包含幾個(gè)方法:lock,加鎖unlock,解鎖tryLock,嘗試加鎖,如果失敗了,并不會(huì)阻塞線程,只是立即返回NOlockBeforeDate:,在指定的date之前暫時(shí)阻塞線程(如果沒有獲取鎖的話),如果到期還沒有獲取鎖,則線程被喚醒,函數(shù)立即返回NO比如:
[cpp] view plain copy print?NSLock *theLock = [[NSLock alloc] init]; if ([theLock lock]) { //do something here [theLock unlock]; } 方法三,NSRecursiveLock,遞歸鎖NSRecursiveLock,多次調(diào)用不會(huì)阻塞已獲取該鎖的線程。[cpp] view plain copy print? NSRecursiveLock *theLock = [[NSRecursiveLock alloc] init]; void MyRecursiveFunction(int value) { [theLock lock]; if (value != 0) <span style="font-size:14px;"> </span>{ –value; MyRecursiveFunction(value); } [theLock unlock]; } MyRecursiveFunction(5);方法四,NSConditionLock,條件鎖NSConditionLock,條件鎖,可以設(shè)置條件
[cpp] view plain copy print?//公共部分 id condLock = [[NSConditionLock alloc] initWithCondition:NO_DATA]; //線程一,生產(chǎn)者 while(true) { [condLock lockWhenCondition:NO_DATA]; //生產(chǎn)數(shù)據(jù) [condLock unlockWithCondition:HAS_DATA]; } //線程二,消費(fèi)者 while (true) { [condLock lockWhenCondition:HAS_DATA]; //消費(fèi) [condLock unlockWithCondition:NO_DATA]; }
方法五,NSDistributedLock,分布鎖NSDistributedLock,分布鎖,文件方式實(shí)現(xiàn),可以跨進(jìn)程用tryLock方法獲取鎖。用unlock方法釋放鎖。如果一個(gè)獲取鎖的進(jìn)程在釋放鎖之前掛了,那么鎖就一直得不到釋放了,此時(shí)可以通過breakLock強(qiáng)行獲取鎖。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注