您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關java單例模式如何寫,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。
這種模式涉及到一個單一的類,該類負責創(chuàng)建自己的對象,同時確保只有單個對象被創(chuàng)建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。
注意:
1、單例類只能有一個實例。2、單例類必須自己創(chuàng)建自己的唯一實例。3、單例類必須給所有其他對象提供這一實例。
java 單例模式5種寫法:
飽漢模式(懶漢模式)
// 飽漢 // UnThreadSafe public class Singleton1 { private static Singleton1 singleton = null; private Singleton1() { } public static Singleton1 getInstance() { if (singleton == null) { singleton = new Singleton1(); } return singleton; } }
優(yōu)點:懶加載啟動快,資源占用小,使用時才實例化,無鎖。
缺點:非線程安全。
飽漢模式(懶漢模式)--線程安全
public class Singleton { /** * 定義一個變量來存儲創(chuàng)建好的類實例 */ private static Singleton uniqueInstance = null; /** * 私有化構造方法,好在內(nèi)部控制創(chuàng)建實例的數(shù)目 */ private Singleton(){ } /** * 定義一個方法來為客戶端提供類實例 * @return 一個Singleton的實例 */ public static synchronized Singleton getInstance(){ //判斷存儲實例的變量是否有值 if(uniqueInstance == null){ //如果沒有,就創(chuàng)建一個類實例,并把值賦值給存儲類實例的變量 uniqueInstance = new Singleton(); } //如果有值,那就直接使用 return uniqueInstance; } /** * 示意方法,單例可以有自己的操作 */ public void singletonOperation(){ //功能處理 } /** * 示意屬性,單例可以有自己的屬性 */ private String singletonData; /** * 示意方法,讓外部通過這些方法來訪問屬性的值 * @return 屬性的值 */ public String getSingletonData(){ return singletonData; } }
優(yōu)點:同上,但加鎖了。
缺點:synchronized 為獨占排他鎖,并發(fā)性能差。即使在創(chuàng)建成功以后,獲取實例仍然是串行化操作。
飽漢模式(懶漢模式)--雙重加鎖檢查DCL(Double Check Lock)
public class Singleton { /** * 對保存實例的變量添加volatile的修飾 */ private volatile static Singleton instance = null; private Singleton(){ } public static Singleton getInstance(){ //先檢查實例是否存在,如果不存在才進入下面的同步塊 if(instance == null){ //同步塊,線程安全的創(chuàng)建實例 synchronized(Singleton.class){ //再次檢查實例是否存在,如果不存在才真的創(chuàng)建實例 if(instance == null){ instance = new Singleton(); } } } return instance; } }
優(yōu)點:懶加載,線程安全。
注:實例必須有 volatile 關鍵字修飾,其保證初始化完全。
餓漢模式
public class Singleton { //4:定義一個靜態(tài)變量來存儲創(chuàng)建好的類實例 //直接在這里創(chuàng)建類實例,只會創(chuàng)建一次 private static Singleton instance = new Singleton(); //1:私有化構造方法,好在內(nèi)部控制創(chuàng)建實例的數(shù)目 private Singleton(){ } //2:定義一個方法來為客戶端提供類實例 //3:這個方法需要定義成類方法,也就是要加static //這個方法里面就不需要控制代碼了 public static Singleton getInstance(){ //5:直接使用已經(jīng)創(chuàng)建好的實例 return instance; } }
優(yōu)點:餓漢模式天生是線程安全的,使用時沒有延遲。
缺點:啟動時即創(chuàng)建實例,啟動慢,有可能造成資源浪費。
Holder模式
public class Singleton { /** * 類級的內(nèi)部類,也就是靜態(tài)的成員式內(nèi)部類,該內(nèi)部類的實例與外部類的實例 * 沒有綁定關系,而且只有被調(diào)用到才會裝載,從而實現(xiàn)了延遲加載 */ private static class SingletonHolder{ /** * 靜態(tài)初始化器,由JVM來保證線程安全 */ private static Singleton instance = new Singleton(); } /** * 私有化構造方法 */ private Singleton(){ } public static Singleton getInstance(){ return SingletonHolder.instance; } }
優(yōu)點:將懶加載和線程安全完美結合的一種方式(無鎖)。
關于java單例模式如何寫就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。