天天看點

Java單例模式

概念:

  java中單例模式是一種常見的設計模式,單例模式分三種:懶漢式單例、餓漢式單例、登記式單例三種。

  單例模式有一下特點:

  1、單例類隻能有一個執行個體。

  2、單例類必須自己自己建立自己的唯一執行個體。

  3、單例類必須給所有其他對象提供這一執行個體。

  單例模式確定某個類隻有一個執行個體,而且自行執行個體化并向整個系統提供這個執行個體。在計算機系統中,線程池、緩存、日志對象、對話框、列印機、顯示卡的驅動程式對象常被設計成單例。這些應用都或多或少具有資料總管的功能。每台計算機可以有若幹個列印機,但隻能有一個Printer Spooler,以避免兩個列印作業同時輸出到列印機中。每台計算機可以有若幹通信端口,系統應當集中管理這些通信端口,以避免一個通信端口同時被兩個請求同時調用。總之,選擇單例模式就是為了避免不一緻狀态,避免政出多頭。

首先看一個經典的單例實作。

Singleton通過将構造方法限定為private避免了類在外部被執行個體化,在同一個虛拟機範圍内,Singleton的唯一執行個體隻能通過getInstance()方法通路。(事實上,通過Java反射機制是能夠執行個體化構造方法為private的類的,那基本上會使所有的Java單例實作失效。此問題在此處不做讨論,姑且掩耳盜鈴地認為反射機制不存在。)

但是以上實作沒有考慮線程安全問題。所謂線程安全是指:如果你的代碼所在的程序中有多個線程在同時運作,而這些線程可能會同時運作這段代碼。如果每次運作結果和單線程運作的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。或者說:一個類或者程式所提供的接口對于線程來說是原子操作或者多個線程之間的切換不會導緻該接口的執行結果存在二義性,也就是說我們不用考慮同步的問題。顯然以上實作并不滿足線程安全的要求,在并發環境下很可能出現多個Singleton執行個體。

運作結果:

  張孝祥

  張孝祥1

  output message 張孝祥

  建立的是同一個執行個體

結論:由結果可以得知單例模式為一個面向對象的應用程式提供了對象惟一的通路點,不管它實作何種功能,整個應用程式都會同享一個執行個體對象。

1.餓漢式單例類

2.懶漢式單例

3.登記式單例

心再堅強也不要獨自飛翔