static Config * instance =
nil;
+(Config *) Instance {
@synchronized(self) {
if(nil ==
instance) {
[self new];
}
}
return
instance;
}
+(id)allocWithZone:(NSZone *)zone {
@synchronized(self) {
if(instance ==
nil){
instance = [super
allocWithZone:zone];
return instance;
}
}
return nil;
}
在上面兩個例子中都用到 關鍵字@synchronized,這裡大概說一下
@synchronized,代表這個方法加鎖, 相當於不管哪一個線程(例如線程A),運行到這個方法時,都要檢查有沒有其它線程例如B正在用這個方法,有的話要等正在使用synchronized方法的線程B運行完這個方法後再運行此線程A,沒有的話,直接運行。它包括兩種用法:synchronized 方法和 synchronized 塊。@synchronized 方法控制對類(一般在IOS中用在單例中)的訪問:每個類執行個體對應一把鎖,每個 synchronized 方法都必須獲得調用該方法鎖方能執行,否則所屬就會發生線程阻塞,方法一旦執行,就獨佔該鎖,直到從該方法返回時才將鎖釋放,此後被阻塞的線程方能獲得該鎖,重新進入可執行狀態。這種機制確保了同一時刻對於每一個類,至多隻有一個處於可執行狀態,從而有效避免了類成員變數的存取違規(只要所有可能訪問類的方法均被聲明為
synchronized)。
synchronized 塊:
@通過 synchronized關鍵字來聲明synchronized 塊。文法如下:
@synchronized(syncObject) { }
synchronized 塊是這樣一個代碼塊,其中的代碼必須獲得對象 syncObject (如前所述,可以是類執行個體或類)的鎖方能執行,具體機制同前所述。由於可以針對任意代碼塊,且可任意指定上鎖的對象,故靈活性較高。