兩個方法用synchronized案例如下:
static SysConfig *instance = nil;
+ (SysConfig*) Instance {
????@synchronized(self) ?{
????if(nil==instance) ?{
????????????instance = [[SysConfig alloc] init];
????????}
????}
????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 方法都必須獲得調(diào)用該方法鎖方能執(zhí)行,否則所屬就會發(fā)生線程阻塞祥得,方法一旦執(zhí)行,就獨占該鎖蒋得,直到從該方法返回時才將鎖釋放级及,此后被阻塞的線程方能獲得該鎖,重新進入可執(zhí)行狀態(tài)额衙。這種機制確保了同一時刻對于每一個類创千,至多只有一個處于可執(zhí)行狀態(tài),從而有效避免了類成員變量的訪問沖突(只要所有可能訪問類的方法均被聲明為 synchronized)入偷。
@通過synchronized關鍵字來聲明synchronized塊追驴。
? ? 語法如下:
? ? ? ? ? ? ? ? ???@synchronized(syncObject) { }
synchronized 塊是這樣一個代碼塊,其中的代碼必須獲得對象 syncObject (如前所述疏之,可以是類實例或類)的鎖方能執(zhí)行殿雪,具體機制同前所述。由于可以針對任意代碼塊锋爪,且可任意指定上鎖的對象丙曙,故靈活性較高。