單例模式 2 各種實現的優缺點

2021-08-27 09:30:36 字數 1392 閱讀 5278

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

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

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

public static  singleton getinstance()  

return instance;

}

假如出現這樣一種情況,如下圖:

明顯地看出,當a、b執行緒併發的情況下,有可能會建立出兩個例項來,也就是單例的控制在併發情況下失效了。

(2)餓漢式是執行緒安全的,因為虛擬機器保證只會裝載一次,在裝載類的時候是不會發生併發的。

(3)如何讓懶漢式實現執行緒安全呢?

當然懶漢式也是可以實現執行緒安全的,只要加上synchronized即可,如下:

publicstaticsynchronizedsingletongetinstance(){}

但是這樣一來,會降低整個訪問的速度,而且每次都要判斷。那麼有沒有更好的方式來實現呢?

(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 單例類的職責過重,在一定程度上違...