單例物件的類必須保證只有乙個例項存在——這是維基百科上對單例的定義,這也可以作為對意圖實現單例模式的**進行檢驗的標準。
對單例的實現可以分為兩大類——懶漢式和餓漢式,他們的區別在於:
singleton類稱為單例類,通過使用private的建構函式確保了在乙個應用中只產生乙個例項,並且是自行例項化的(在singleton中自己new singleton())。單例模式的通用**如下(這種也稱為餓漢式單例):
public class singleton
//3.提供乙個公共介面,用來返回剛剛new出來的物件
public static singleton getinstance()
public void test()
}
懶漢模式(非執行緒安全)
上面是乙個經典的單例模式程式,且這個程式不會產生執行緒同步問題,因為類第一次載入的時候就初始化了instance。但是單例模式還有其他的實現方式,就有可能會出現執行緒同步問題,請看下面的例子:
/*
* 這種方式就是非執行緒安全了(懶漢式單例)
*/public class singleton
public static singleton getinstance()
return instance;
}}
為什麼會出現執行緒安全問題呢?假如乙個執行緒a執行到instance = new singleton(),但還沒有獲得物件(物件的初始化是需要時間的),第二個執行緒b也在執行,執行到判斷instance == null時,那麼執行緒b獲得的條件也是真,於是也進入例項化instance了,然後執行緒a獲得了乙個物件,執行緒b也獲得了乙個物件,在記憶體中就存在了兩個物件了!
解決執行緒安全問題的方法有很多,比如我們可以在getinstance()方法前面加上synchronized關鍵字來解決,如下:
懶漢模式(執行緒安全)
/*
* 這種方式就是執行緒安全了(懶漢式單例)
*/public class singleton
public static synchronized singleton getinstance()
return instance;
}
}
但是synchronized關鍵字鎖住的是這個物件,這樣的用法在效能上會有所下降,因為每次呼叫getinstance()時都要對物件上鎖。
可以在內部加synchronized 第一次建立物件的時候就加上,後面就不需要了。
public class singleton
public static singleton getinstance()}}
return instance;
} }
1.要求生成唯一序列號的環境。
2.在整個專案中需要乙個共享訪問點或共享資料,例如乙個web頁面上的訪問量,可以不用每次重新整理都把記錄存到資料庫,但是要確保單例執行緒安全。
3.建立乙個物件需要消耗的資源過多,如要訪問io和資料庫等資源。
4.需要定義大量靜態常量和靜態方法(如工具類)的環境,可以採用單例模式,當然也可以直接宣告為static方式。
1.在記憶體中只存在乙個例項,所有減小誒村的開支,特別是乙個物件需要頻繁的建立和銷毀時,而且建立或銷毀時效能又無法優化,單例模式的優勢就非常明顯。
2.減小了系統的效能開銷,當乙個物件的產生需要比較多的資源時,如讀取配置、產生依賴物件時,則可以通過在應用啟動時直接產生乙個單例物件,然後用永久駐留在記憶體中。
3.可以避免對資源的多重占用,如寫檔案動作,由於只有乙個例項存在記憶體中,避免對同乙個資源檔案的同時寫操作。
4.單例模式可以在系統設定全域性的訪問點,優化和共享資源訪問,例如可以設計乙個單例類,負責所有資料表的對映處理。
1.單例模式沒有介面,擴充套件很難,若要擴充套件,除了修改**基本上沒有第二種途徑可以實現。
2.單例模式對測試是不利的,在並行開發環境中,如果單例模式沒有完成,是不能進行測試的。
Java單例模式詳解
設計模式有很多種,相信大家用的最多的應該是單例設計模式,也是應用最為廣泛的設計模式。下面將帶領大家來學習下。singleton是一種建立型模式,指某個類採用singleton模式,則在這個類被建立後,只可能產生乙個例項供外部訪問,並且提供乙個全域性的訪問點。乙個單例模式的核心是什麼?將採用單例設計模...
JAVA單例模式詳解
什麼是單例模式 單例模式 singleton pattern 是指確保乙個類在任何情況下都絕對只有乙個例項,並 提供乙個全域性訪問點。單例模式是建立型模式。public class hungrysingleton public static hungrysingleton getinstance 還...
Java設計模式詳解之單例模式
解決的問題 保證乙個類在記憶體中的物件唯一性。eg 多程式讀取乙個配置檔案時,建議配置檔案封裝成物件。會方便操作其中資料,又要保證多個程式讀到的是同乙個配置檔案物件,就需要該配置檔案物件在記憶體中是唯一的。不讓其他程式建立該類物件。在本類中建立乙個本類物件。對外提供方法,讓其他程式獲取這個物件。pu...