單例模式的意思就是只有乙個
例項。單例模式確保某乙個類只有乙個例項,而且自行
例項化並向整個系統提供這個例項。這個類稱為單例類。
#import@inte***ce
singleton : nsobject
+(singleton *) getinstance;
@end
@implementation
singleton
+(singleton *) getinstance
}return
sharedsingleton_; }
+ (id) allocwithzone:(nszone *)zone
- (id) copywithzone:(nszone*)zone
- (id
) retain
-(nsuinteger) retaincount
//oneway用在分布式物件的api,這些api可以在不同的執行緒,甚至是不同的程式。oneway關鍵字只用在返回型別為void的訊息定義中, 因為oneway是非同步的,其訊息預計不會立即返回。當然,ios 5以上啟用arc就簡單多了:-(oneway
void
)release
- (id
) autorelease
@end
static rootviewcontroller* sharedrootcontroller =nil;單例模式的優缺點+(rootviewcontroller *) sharedcontroller
}return
singlecontroller;
}
1、時間和空間
比較上面兩種寫法:懶漢式是典型的時間換空間,也就是每次獲取例項都會進行判斷,看是否需要建立例項,浪費判斷的時間。當然,如果一直沒有人使用的話,那就不會建立例項,則節約記憶體空間。
餓漢式是典型的空間換時間,當類裝載的時候就會建立類例項,不管你用不用,先建立出來,然後每次呼叫的時候,就不需要再判斷了,節省了執行時間。
2、執行緒安全
(1)從執行緒安全性上講,不加同步的懶漢式是執行緒不安全的,比如,有兩個執行緒,乙個是執行緒a,乙個是執行緒b,它們同時呼叫getinstance方法,那就可能導致併發問題。如下示例:
public static singleton getinstance()程式繼續執行,兩個執行緒都向前走了一步,如下:return instance;
}
public static singleton getinstance()可能有些朋友會覺得文字描述還是不夠直觀,再來畫個圖說明一下,如圖5.4所示。return instance;
}
通過圖5.4的分解描述,明顯地看出,當a、b執行緒併發的情況下,會建立出兩個例項來,也就是單例的控制在併發情況下失效了。
(2)餓漢式是執行緒安全的,因為虛擬機器保證只會裝載一次,在裝載類的時候是不會發生併發的。
(3)如何實現懶漢式的執行緒安全呢?
當然懶漢式也是可以實現執行緒安全的,只要加上synchronized即可,如下:
public static synchronized singleton getinstance(){}但是這樣一來,會降低整個訪問的速度,而且每次都要判斷。那麼有沒有更好的方式來實現呢?
(4)雙重檢查加鎖
可以使用"雙重檢查加鎖"的方式來實現,就可以既實現執行緒安全,又能夠使效能不受到很大的影響。那麼什麼是"雙重檢查加鎖"機制呢?
所謂雙重檢查加鎖機制,指的是:並不是每次進入getinstance方法都需要同步,而是先不同步,進入方法過後,先檢查例項是否存在,如果不存在才進入下面的同步塊,這是第一重檢查。進入同步塊過後,再次檢查例項是否存在,如果不存在,就在同步的情況下建立乙個例項,這是第二重檢查。這樣一來,就只需要同步一次了,從而減少了多次在同步情況下進行判斷所浪費的時間。
雙重檢查加鎖機制的實現會使用乙個關鍵字volatile,它的意思是:被volatile修飾的變數的值,將不會被本地執行緒快取,所有對該變數的讀寫都是直接操作共享記憶體,從而確保多個執行緒能正確的處理該變數。
看看**可能會更加清楚些。示例**如下:
public class singleton這種實現方式可以實現既執行緒安全地建立例項,而又不會對效能造成太大的影響。它只是在第一次建立例項的時候同步,以後就不需要同步了,從而加快了執行速度。public static singleton getinstance()
} }
return instance;
} }
單例模式 單例模式
餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...
IOS 單例模式
單例模式顧名思義就是只有乙個例項,它確保乙個類只有乙個例項,並且自行例項化並向整個系統提供這個例項。它經常用來做應用程式級別的共享資源控制。這個模式使用頻率非常高,通過乙個單例類,可以實現在不同視窗之間傳遞資料。在objective c中要實現乙個單例類,至少需要做以下四個步驟 1 為單例物件實現乙...
iOS 單例模式
最近在ios開發中,需要用到單例模式,於是自己動手寫了乙個,它看起來是這樣的 1 id sharedinstance return sharedinstance 後來發現許多書上的做法都使用到了bool變數作為標值位,它看起來是這樣的 2 id sharedinstance return share...