單例:
概念:
乙個類只能產生乙個例項化物件。
單例的特點:
構造方法私有化,外部無法通過構造方法建立物件,只能通過該類提供的可見靜態方法得到該類物件。
單例模式的8種寫法:
1,餓漢式(靜態常量)[可用]
class
singleton
//獲得該例項的方法,必須是可見的靜態方法
public
static singleton getinstance()
}public
class
testsingleton
}
缺點:在類載入的時候就例項化物件,沒有達到lazy loading的效果。如果一直沒用使用該類,就會造成記憶體浪費。
2.餓漢式(靜態**塊)[可用]
class
singleton
private
singleton()
public singleton getinstance()
}
3.懶漢式(執行緒不安全)[不可用]
public
class
singleton
public
static singleton getinstance()
return instance;
}}
該方法起到lazy loading的作用,但是只能在單執行緒下使用。在多執行緒情況下,當乙個執行緒進入if()判斷時還沒來得及往下執行,其他執行緒也進入到該方法,這時就會產生多個例項,所以不能在多執行緒環境下使用該方法。
4.懶漢式(執行緒安全,同步方法)[不推薦用]
public
class
singleton
public
static
synchronized singleton getinstance()
return instance;
}}
這個方法對第三種方法進行了執行緒安全處理,給方法上加上synchronized關鍵字。但這樣做效率太低,每個執行緒想獲取例項時,都要進入getinstance()方法。這個方法實際只需要進行一次,後面需要獲取例項化物件,直接return就行,這樣效率低下需要改進。
5.懶漢式(執行緒安全,同步**塊)[不可用]
public
class
singleton
public
static singleton getinstance()
return instance;}}
}
由於上一種方法效率太低,所以我們採用同步**塊的方式。但這個方法實際不能起到同步作用,與第三種方法缺陷類似,當乙個執行緒進入if()判斷句後還沒來得及往下執行,其他執行緒也進入到這個方法,這樣就會產生不止乙個例項化物件。
6.懶漢式(雙重檢查 double check)[可用]
public
class
singleton
public
static singleton getinstance()
}return instance;}}
}
我們進行兩次if()檢查,這樣就可以保證執行緒安全了。這樣就可以例項化**只進行一次,後面再要訪問時,只要判斷到if(instance==null)就會直接返回例項化物件。
7.靜態內部類[推薦使用]
public
class
singleton
private
static
class
singletoninstance
public
static singleton getinstance()
}
這種方式和餓漢式的機制相似,但又不同。餓漢式在類裝載時就會例項化物件,沒有起到 lazy loading 的效果,但這種方式在類裝載時不會立即例項化物件,只有在呼叫getinstance()方法時才會呼叫靜態內部類的例項化物件。由於靜態內部類方法只會在第一次類載入時初始化,jvm幫助我們保證了執行緒安全。
優點:延遲載入,效率高,執行緒安全。
8,列舉[推薦用,亮點]
public
enum singleton
}
利用jdk1.5中新增的列舉來實現單例,不僅保證了執行緒安全,還能防止反序列化時重新被建立新物件。 單例模式的八種寫法
單例模式是最常用到的設計模式之一,熟悉設計模式的朋友對單例模式都不會陌生。一般介紹單例模式的書籍都會提到餓漢式和懶漢式這兩種實現方式。但是除了這兩種方式,本文還會介紹其他幾種實現單例的方式,讓我們來一起看看吧。單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。許多時候整個系...
單例模式的八種寫法
單例模式是最常用到的設計模式之一,熟悉設計模式的朋友對單例模式都不會陌生。一般介紹單例模式的書籍都會提到 餓漢式 和 懶漢式 這兩種實現方式。但是除了這兩種方式,本文還會介紹其他幾種實現單例的方式,讓我們來一起看看吧。簡介單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。許...
單例模式的八種寫法
介紹 單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。許多時候整個系統只需要擁有乙個的全域性物件,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲...