單例模式能夠說是23中設計模式中應用最廣的一種模式了。
java
定義:確保某一個類只有一個實例,自行實例化而且想整個系統提供這個實例。設計模式
使用場景:避免某個類產生多個對象而消耗過多的資源,確保某個類在程序中只有一個實例。好比咱們使用的圖片加載器ImageLoader。每每單例建立的對象,耗費的資源都比較多,因此在初始化單例對象的時候就顯得尤其重要了,接下來,咱們就來聊一聊單例的幾種實現方式。多線程
1、餓漢式ide
[java] view plain copy性能
public class ImageLoader{ 優化
private static ImageLoader instance = new ImageLoader; url
private ImageLoader(){} spa
public static ImageLoader getInstance(){ .net
return instance; 線程
}
}
餓漢式顧名思義,就是這個漢子很餓,一上來就把單例對象建立出來了,要用的時候直接返回便可,這種能夠說是單例模式中最簡單的一種實現方式。可是問題也比較明顯。單例在尚未使用到的時候,初始化就已經完成了。也就是說,若是程序從頭到位都沒用使用這個單例的話,單例的對象仍是會建立。這就形成了沒必要要的資源浪費。因此不推薦這種實現方式。
2、懶漢式
[java] view plain copy
public class ImageLoader{
private static ImageLoader instance;
private ImageLoader(){}
public static synchronized ImageLoader getInstance(){
if(instance == null){
instance = new ImageLoader();
}
return instance;
}
}
餓漢式也顧名思義,就是這個漢子比較懶,一開始的時候什麼也不作,知道要使用的時候採起建立實例的對象。看起來還不錯,只有在使用實例的時候,咱們纔回去建立對象。可是細心的同窗可能發現了,咱們在獲取實例的方法上加了鎖,避免多線程引起的建立多個單例的狀況。多線程的問題是避免了,但也形成了總體性能的降低,每次使用單例對象,都須要鎖判斷,下降了總體性能。很明顯,懶漢式也不是咱們所要追求的目標。
3、Double CheckLock實現單例
英文稍好點的東西,應該都看懂了,DCL也就是雙重鎖判斷機制,直接上代碼。
[java] view plain copy
public class ImageLoader{
private static ImageLoader instance;
private ImageLoader(){}
public static ImageLoader getInstance(){
if(instance == null){
synchronized (ImageLoader.class){
if(instance == null){
instance = new ImageLoader();
}
}
}
return instance;
}
}
能夠看到,在獲取單例對象的時候,咱們先進行了兩爲空判斷,而且在第二次判斷前加了鎖,這就讓程序變得更加優秀,在使用的時候,只會前幾回獲取單例對象的時候會進行鎖判斷,一旦單例對象建立完成,鎖的任務也就完成了,在懶漢式的基礎上,提升了性能。DCL是使用最多的單例實現方式,可以在使用的時候才進行單例對象的初始化建立,而且可以在絕大多數狀況下保證對象的惟一性的正確性。請注意,是絕大多數狀況下,也就是說,這種模式也不能徹底保證單例的對象的完美實現,可是,就通常狀況下,這種模式都能知足需求。俗話說,學無止境,接下來咱們就來看看單例模式的終極實現版本。
4、靜態內部類實現模式
直接上代碼
[java] view plain copy
public class ImageLoader{
private static class InnerInstance{
private static final ImageLoader instance = new ImageLoader();
}
private ImageLoader(){}
public static ImageLoader ImageLoader(){
return InnerInstance.instance;
}
}
能夠發現這種方式,並未加鎖,由於第一次加載ImageLoader類時,並不會實例化單例對象,只有第一次調用getInstance()方法時會致使虛擬機加載InnerInstance類,這種
方式不只能保證對象的單一性,還避免加鎖帶來的性能問題,又啓動了延遲加載的優化,因此這就是單例模式的終極實現版本,也是推薦使用的方式。