@synchronized(self)的用法

線程的同步執(zhí)行

這個(gè)東西其實(shí)就是 一個(gè)加鎖。如果self 其他線程訪問,則會(huì)阻塞。這樣做一般是用來對(duì)單例 進(jìn)行一個(gè)死鎖的保護(hù)

如下:

staticConfig* instance =nil;

+(Config*) Instance {

@synchronized(self) ?{

if(nil==instance) ?{

[selfnew];

}

}

returninstance;

}

+(id)allocWithZone:(NSZone*)zone {

@synchronized(self) ?{

if(instance==nil){

instance= [superallocWithZone:zone];

returninstance;

}

}

returnnil;

}

Objective-C支持程序中的多線程。這就意味著兩個(gè)線程有可能同時(shí)修改同一個(gè)對(duì)象,這將在程序中導(dǎo)致嚴(yán)重的問題。為了避免這種多個(gè)線程同時(shí)執(zhí)行同一段代碼的情況,Objective-C提供了@synchronized()指令。

指令@synchronized()通過對(duì)一段代碼的使用進(jìn)行加鎖。其他試圖執(zhí)行該段代碼的線程都會(huì)被阻塞,直到加鎖線程退出執(zhí)行該段被保護(hù)的代碼段,也就是說@synchronized()代碼塊中的最后一條語句已經(jīng)被執(zhí)行完畢的時(shí)候。

指令@synchronized()需要一個(gè)參數(shù)。該參數(shù)可以使任何的Objective-C對(duì)象,包括self。這個(gè)對(duì)象就是互斥信號(hào)量。他能夠讓一個(gè)線程對(duì)一段代碼進(jìn)行保護(hù),避免別的線程執(zhí)行該段代碼。針對(duì)程序中的不同的關(guān)鍵代碼段,我們應(yīng)該分別使用不同的信號(hào)量。只有在應(yīng)用程序編程執(zhí)行多線程之前就創(chuàng)建好所有需要的互斥信號(hào)量對(duì)象來避免線程間的競爭才是最安全的。

列表12-1的代碼中使用self作為互斥信號(hào)量來實(shí)現(xiàn)當(dāng)前對(duì)象對(duì)實(shí)例方法訪問的同步。

-(void)criticalMethod

{

@synchronized(self)

{

//關(guān)鍵代碼;

}

}

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容