Java 單例模式

2021-09-12 11:36:06 字數 2684 閱讀 5891

單例:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

單例模式是一種常用的軟體設計模式之一,其目的是保證整個應用中只存在類的唯一個例項。

比如我們在系統啟動時,需要載入一些公共的配置資訊,對整個應用程式的整個生命週期中都可見且唯一,這時需要設計成單例模式。如:spring容器,session工廠,快取,資料庫連線池等等。

1)防止外部初始化

2)由類本身進行例項化

3)保證例項化一次

4)對外提供獲取例項的方法

5)執行緒安全

(1)餓漢式

「因為餓,所以要立即吃飯,刻不容緩」,在定義類的靜態私有變數同時進行例項化。

public class singleton {

private static final singleton singleton = new singleton();

private singleton() {

public static singleton getinstance() {

return singleton;

①宣告靜態私有類變數,且立即例項化,保證例項化一次

②私有構造,防止外部例項化(通過反射是可以例項化的,不考慮此種情況)

③提供public的getinstance()方法供外部獲取單例例項

好處:執行緒安全;獲取例項速度快 缺點:類載入即初始化例項,記憶體浪費

(2)懶漢式

「這個人比較懶,等用著你的時候才去例項化」,延遲載入。

public class singleton {

private static singleton singleton = null;

private singleton() {

public static singleton getinstance() {

if (singleton == null) {

singleton = new singleton();

return singleton;

優點:在獲取例項的方法中,進行例項的初始化,節省系統資源

缺點:①如果獲取例項時,初始化工作較多,載入速度會變慢,影響系統系能

②每次獲取例項都要進行非空檢查,系統開銷大

③非執行緒安全,當多個執行緒同時訪問getinstance()時,可能會產生多個例項

接下來對它進行執行緒安全改造:

1)同步鎖

public synchronized static singleton getinstance() {

if (singleton == null) {

singleton = new singleton();

return singleton;

優點:執行緒安全,缺點:每次獲取例項都要加鎖,耗費資源,其實只要例項已經生成,以後獲取就不需要再鎖了

2)雙重檢查鎖

public static singleton getinstance() {

if (singleton == null) {

synchronized (singleton.class) {

if (singleton == null) {

singleton = new singleton();

return singleton;

優點:執行緒安全,進行雙重檢查,保證只在例項未初始化前進行同步,效率高 缺點:還是例項非空判斷,耗費一定資源

3)靜態內部類

public class singleton {

private singleton() {

private static class singletonholder {

private static final singleton singleton = new singleton();

public static singleton getinstance() {

return singletonholder.singleton;

優點:既避免了同步帶來的效能損耗,又能夠延遲載入

(3)列舉

public enum singleton {

instance;

public void init() {

system.out.println("資源初始化。。。");

天然執行緒安全,可防止反射生成例項。推薦使用

四、單例模式的優缺點

優點:該類只存在乙個例項,節省系統資源;對於需要頻繁建立銷毀的物件,使用單例模式可以提高系統效能。

缺點:不能外部例項化(new),呼叫人員不清楚呼叫哪個方法獲取例項時會感到迷惑,尤其當看不到源**時。

原文:

java單例模式

第一種方法 public class singleton private static singleton singleton new singleton public static singleton getinstance 第二種方法 public class singleton private...

Java 單例模式

單例模式特點 1 單例類只能有乙個例項。2 單例類必須自己自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。一 餓漢式單例 基於classloder機制避免了多執行緒的同步問題,使用較多 public class singleton 這裡提供了乙個供外部訪問本class的靜態方法,可...

Java單例模式

單例模式的意圖是為了確保乙個類有且僅有乙個例項,並為它提供乙個全域性訪問點。單例模式通過隱藏建構函式,提供物件建立的唯一入口點,從而將類的職責集中在類的單個例項中。design patterns一書中把單例模式歸類為 建立型 模式,意圖是在表明單例物件承擔了其他物件所要依賴的職責。單例模式的優點 在...