單例的優缺點

2021-09-30 10:53:21 字數 2434 閱讀 2134

單例模式的意思就是只有乙個例項。單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單例類。

#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是非同步的,其訊息預計不會立即返回。

-(oneway

void

)release

- (id

) autorelease

@end

當然,ios 5以上啟用arc就簡單多了:

static rootviewcontroller* sharedrootcontroller =nil;

+(rootviewcontroller *) sharedcontroller

}return

singlecontroller;

}

單例模式的優缺點

1、時間和空間

比較上面兩種寫法:懶漢式是典型的時間換空間,也就是每次獲取例項都會進行判斷,看是否需要建立例項,浪費判斷的時間。當然,如果一直沒有人使用的話,那就不會建立例項,則節約記憶體空間。

餓漢式是典型的空間換時間,當類裝載的時候就會建立類例項,不管你用不用,先建立出來,然後每次呼叫的時候,就不需要再判斷了,節省了執行時間。

2、執行緒安全

(1)從執行緒安全性上講,不加同步的懶漢式是執行緒不安全的,比如,有兩個執行緒,乙個是執行緒a,乙個是執行緒b,它們同時呼叫getinstance方法,那就可能導致併發問題。如下示例:

public static  singleton getinstance()  

return instance;  

程式繼續執行,兩個執行緒都向前走了一步,如下:

public static  singleton getinstance()  

return instance;  

可能有些朋友會覺得文字描述還是不夠直觀,再來畫個圖說明一下,如圖5.4所示。

通過圖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;  

}  } 

這種實現方式可以實現既執行緒安全地建立例項,而又不會對效能造成太大的影響。它只是在第一次建立例項的時候同步,以後就不需要同步了,從而加快了執行速度。

單例模式優 缺點

1,例項控制 單例模式防止其它物件對自己的例項化,確保所有的物件都訪問乙個例項。2,伸縮性 因為由類自己來控制例項化程序,類就在改變例項化程序上有相應的伸縮性。單例模式的缺點 1,系統開銷。雖然這個系統開銷看起來很小,但是每次引用這個類例項的時候都要進行例項是否存在的檢查。這個問題可以通過靜態例項來...

單例模式優缺點

5.3.7 單例模式的優缺點 1 時間和空間 比較上面兩種寫法 懶漢式是典型的時間換空間,也就是每次獲取例項都會進行判斷,看是否需要建立例項,浪費判斷的時間。當然,如果一直沒有人使用的話,那就不會建立例項,則節約記憶體空間。餓漢式是典型的空間換時間,當類裝載的時候就會建立類例項,不管你用不用,先建立...

單例模式優缺點

主要優點 1 提供了對唯一例項的受控訪問。2 由於在系統記憶體中只存在乙個物件,因此可以節約系統資源,對於一些需要頻繁建立和銷毀的物件單例模式無疑可以提高系統的效能。3 允許可變數目的例項。主要缺點 1 由於單利模式中沒有抽象層,因此單例類的擴充套件有很大的困難。2 單例類的職責過重,在一定程度上違...