線程的同步執(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)鍵代碼;
}
}