單例模式是1種對象創建型模式,使用單例模式,可以保證為1個類只生成唯1的實例對象。也就是說,在全部程序空間中,該類只存在1個實例對象。
即保證1個類、只有1個實例存在,同時提供1個全局唯1訪問這個類的訪問點。
單例模式類圖:
在利用系統開發中,我們常常有以下需求:
-在多個線程之間,比如servlet環境,同享同1個資源或操作同1個對象
-在全部程序空間使用全局變量,同享資源
-大范圍系統中,為了性能的斟酌,需要節省對象的創建時間等等。
由于Singleton模式可以保證為1個類只生成唯1的實例對象,所以這些情況,Singleton模式就派上用處了。
單例模式的實現有:懶漢式、餓漢式和兩重檢查。懶漢式調用順序:
餓漢式調用順序圖:
懶漢式是典型的時間換空間,餓漢式是典型的空間換時間。
不加同步的懶漢式是線程不安全的,實現懶漢式線程安全只需加synhronized便可。
餓漢式是線程安全的,由于虛擬機保證了只會裝載1次。
“兩重檢查”就是在getInstance()中減少使用同步。
第1重檢查:其實不是每次進入getInstace方法都要同步,而是先不同步,進入方法 后,先檢查實例是不是存在,不存在才進入下面的同步塊。
第2重檢查:進入同步塊只會再次檢查實例是不是存在,不存在就在同步的情況下創建1個實例這是第2重檢查。
這樣只需同步1次,從而減少了屢次同步情況下進行判斷所浪費的時間。
單例模式的本質是控制實例數目,當需要控制1個類的實例只能有1個,而且客戶只能從1個全局訪問點訪問它時可以選用單例模式。