java 單例模式詳解

2021-09-12 23:04:00 字數 1996 閱讀 5919

單例物件的類必須保證只有乙個例項存在——這是維基百科上對單例的定義,這也可以作為對意圖實現單例模式的**進行檢驗的標準。

對單例的實現可以分為兩大類——懶漢式和餓漢式,他們的區別在於:

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...