定義:所謂單例模式,就是說保證乙個類只有乙個例項且自行例項化並向整個系統提供這個例項。這樣做可以避免頻繁建立物件,節約記憶體。
在了解單例模式之前,先說說關於類的載入順序和static關鍵字。
類的載入順序
一般分為兩種情況
1.類沒有被載入過:(該載入過程是執行緒私有的,其他執行緒無法進入)
2.類已經載入過
此時靜態**塊和靜態變數不再重複載入,再次建立類物件時,只執行和例項相關的變數初始化和建構函式
static關鍵字
乙個類中如果有成員變數或者方法被static修飾,那麼該成員變數或者方法將獨立於該類的任何物件。一句話來描述就是:它不在依賴類的特定例項,而是被該類的所有例項共享,只要這個類被載入,就可以通過類名去呼叫這個成員變數或者方法。
單例模式的懶漢和餓漢
餓漢式:在類載入過程中就完成了初始化,所以載入過程比較慢,但是獲取物件的速度較快。
懶漢式:類載入過程中不初始化,在被第一次使用時才初始化。
**實現
1.餓漢式(可採取)
1public
class
singleton56
public
static
singleton getintance()
9 }
在類載入的過程就完成了例項化,避免了多執行緒同步的問題;缺點是在類載入時就例項化沒有達到lazyloading(懶載入)效果,可能造成浪費記憶體(該例項沒有被使用)
2.普通的懶漢式(執行緒不安全,不可採取)
1public
class
singleton56
public
static
singleton getintance()
10return
instance;11}
12 }
這是懶漢式最普通的一種寫法,只有第一次被訪問才會例項化,達到了lazyloading的效果。但是存在多執行緒安全的問題,假如物件還沒有例項化,就有兩個及以上的執行緒來訪問,就會造成多次例項化的結果,所以不可採取。
3.同步方法的懶漢式(可採取)
publicclass
singleton
public
static
synchronized
singleton getinstance()
return
instance;
}}
這種寫法是對getinstance()加鎖,保證了同一時刻只有乙個執行緒訪問成功並獲得例項,但是缺點也很明顯,因為synchronized修飾的是整個方法,每個執行緒訪問都需要同步,事實上這個方法只需要執行一次就可以了,每次都同步方法效率顯然是低的,所以也不建議採用這種寫法。
4.雙重檢查懶漢式(可採取)
publicclass
singleton
public
static
singleton getinstance()}}
return
instance;
}
}
這種雙if寫法,即是double-check.並且同步的不是方法,而是**塊,效率比較高。做兩次判斷是為了執行緒安全,例如執行緒x和執行緒y同事訪問靜態方法並且同時執行到第乙個if判斷語句,這時x先進入到同步**塊中例項化物件了,結束後y也進入同步**塊中,因為第二個if的存在,執行緒y不會再例項化了。懂了嗎?????
5.靜態內部類(推薦)
publicclass
singleton
private
static
class
singletoninstance()
public
static
getinstance()
}
這種靜態類方式在singleton類載入時並不會被例項化,而是在需要例項化時,呼叫getinstance()方法時,才會裝載singletoninstance類,從而完成物件的例項化,這種方法也是執行緒安全的。
6.列舉(推薦)
publicenum
singleton
這種寫法解決了兩個問題;
1執行緒的安全問題。j**a虛擬機器在載入列舉類的時候會使用classloader的方法,這個方法使用了同步**塊來保證執行緒安全。
2避免反序列化破壞物件,因為列舉的反序列化並不是通過反射機制完成的。
單例模式的優缺點
優點;單例模式只有乙個例項,節約記憶體資源,對於某些需要頻繁建立銷毀的物件,單例模式可以提高系統效能。
單例模式可以在系統設定全域性訪問點,優化和共享資料,例如web應用的頁面計數器,可以用單例模式完成計數值的儲存。
缺點;單例模式一般沒有介面,擴充套件性較差。
設計模式 單例模式
單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...
設計模式 單例模式
class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...
設計模式 單例模式
單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...