Objective-C支持程序中的多線程壁拉。這就意味著兩個線程有可能同時修改同一個對象农渊,這將在程序中導(dǎo)致嚴重的問題贝或。為了避免這種多個線程同時執(zhí)行同一段代碼的情況芝发,Objective-C提供了@synchronized()指令渡讼。
指令@synchronized()通過對一段代碼的使用進行加鎖骂束。其他試圖執(zhí)行該段代碼的線程都會被阻塞,直到加鎖線程退出執(zhí)行該段被保護的代碼段成箫,也就是說@synchronized()代碼塊中的最后一條語句已經(jīng)被執(zhí)行完畢的時候展箱。
指令@synchronized()需要一個參數(shù)。該參數(shù)可以使任何的Objective-C對象蹬昌,包括self混驰。這個對象就是互斥信號量。他能夠讓一個線程對一段代碼進行保護皂贩,避免別的線程執(zhí)行該段代碼栖榨。針對程序中的不同的關(guān)鍵代碼段,我們應(yīng)該分別使用不同的信號量先紫。只有在應(yīng)用程序編程執(zhí)行多線程之前就創(chuàng)建好所有需要的互斥信號量對象來避免線程間的競爭才是最安全的治泥。
@synchronized,代表這個方法加鎖, 相當于不管哪一個線程(例如線程A)遮精,運行到這個方法時,都要檢查有沒有其它線程例如B正在用這個方法居夹,有的話要等正在使用synchronized方法的線程B運行完這個方法后再運行此線程A,沒有的話,直接運行。它包括兩種用法:synchronized 方法和 synchronized 塊本冲。
@synchronized 方法
控制對類(一般在IOS中用在單例中)的訪問:每個類實例對應(yīng)一把鎖准脂,每個 synchronized 方法都必須獲得調(diào)用該方法鎖方能執(zhí)行,否則所屬就會發(fā)生線程阻塞檬洞,方法一旦執(zhí)行狸膏,就獨占該鎖,直到從該方法返回時才將鎖釋放添怔,此后被阻塞的線程方能獲得該鎖湾戳,重新進入可執(zhí)行狀態(tài)。這種機制確保了同一時刻對于每一個類广料,至多只有一個處于可執(zhí)行狀態(tài)砾脑,從而有效避免了類成員變量的訪問沖突(只要所有可能訪問類的方法均被聲明為 synchronized)。
@synchronized 塊
通過 synchronized關(guān)鍵字來聲明synchronized 塊艾杏。語法如下:
@synchronized(syncObject) { }
synchronized 塊是這樣一個代碼塊韧衣,其中的代碼必須獲得對象 syncObject (如前所述,可以是類實例或類)的鎖方能執(zhí)行,具體機制同前所述畅铭。由于可以針對任意代碼塊氏淑,且可任意指定上鎖的對象,故靈活性較高硕噩。
用法
static Config * instance = nil;
+(Config *) Instance {
@synchronized(self) {
if(nil == instance) {
[self new];
}
}
return instance;
}